EF架构~过滤导航属性等,拼接SQL字符串

时间:2023-01-02 19:02:22

拼接T—SQL串,并使它具有通用性

好处:与服务器建立一次连接,给服务器发一条SQL命令,即可实现

代码如下:

EF架构~过滤导航属性等,拼接SQL字符串
 1   /// <summary>
2 /// 构建Insert语句串
3 /// 主键为自增时,如果主键值为0,我们将主键插入到SQL串中
4 /// </summary>
5 /// <typeparam name="TEntity"></typeparam>
6 /// <param name="entity"></param>
7 /// <returns></returns>
8 private Tuple<string, object[]> CreateInsertSQL<TEntity>(TEntity entity) where TEntity : class
9 {
10 if (entity == null)
11 throw new ArgumentException("The database entity can not be null.");
12
13 Type entityType = entity.GetType();
14 var table = entityType.GetProperties().Where(i => i.PropertyType != typeof(EntityKey)
15 && i.PropertyType != typeof(EntityState)
16 && i.GetValue(entity, null) != null
17 && (i.PropertyType.IsValueType || i.PropertyType == typeof(string)))
18 .ToArray();//过滤主键,航行属性,状态属性等
19 List<string> pkList = GetPrimaryKey<TEntity>().Select(i => i.Name).ToList();
20
21 List<object> arguments = new List<object>();
22 StringBuilder fieldbuilder = new StringBuilder();
23 StringBuilder valuebuilder = new StringBuilder();
24
25 fieldbuilder.Append(" INSERT INTO " + string.Format("[{0}]", entityType.Name) + " (");
26
27 foreach (var member in table)
28 {
29 if (pkList.Contains(member.Name) && Convert.ToString(member.GetValue(entity, null)) == "0")
30 continue;
31 object value = member.GetValue(entity, null);
32 if (value != null)
33 {
34 if (arguments.Count != 0)
35 {
36 fieldbuilder.Append(", ");
37 valuebuilder.Append(", ");
38 }
39
40 fieldbuilder.Append(member.Name);
41 if (member.PropertyType == typeof(string) || member.PropertyType == typeof(DateTime))
42 valuebuilder.Append("'{" + arguments.Count + "}'");
43 else
44 valuebuilder.Append("{" + arguments.Count + "}");
45 if (value.GetType() == typeof(string))
46 value = value.ToString().Replace("'", "char(39)");
47 arguments.Add(value);
48
49 }
50 }
51
52
53 fieldbuilder.Append(") Values (");
54
55 fieldbuilder.Append(valuebuilder.ToString());
56 fieldbuilder.Append(");");
57 return new Tuple<string, object[]>(fieldbuilder.ToString(), arguments.ToArray());
58 }
EF架构~过滤导航属性等,拼接SQL字符串

对于EF架构中的批量更新操作,需要我们为实体的导航属性进行手动的标示,因为EF生成的实体中没有一个特殊的说明,所以,我们必须要告诉系统,哪个属性是导航属性,而导航属性是我们不去进行update的。

EF架构~过滤导航属性等,拼接SQL字符串
1    /// <summary>
2 /// 属性的导航属性
3 /// </summary>
4 public class NavigationAttribute : Attribute
5 {
6
7 }
EF架构~过滤导航属性等,拼接SQL字符串

而对于要进行批量更新的实体,我们需要为导航属性添加这个特性

EF架构~过滤导航属性等,拼接SQL字符串
1    public class User
2 {
3 public int UserID { get; set; }
4 [Navigation]
5 public User_Extension User_Extension { get; set; }
6 }
EF架构~过滤导航属性等,拼接SQL字符串

而对于我们构建批量Update语句,请看代码,它需要对导航属性进行过滤

EF架构~过滤导航属性等,拼接SQL字符串
 1         /// <summary>
2 /// 构建Update语句串
3 /// </summary>
4 /// <typeparam name="TEntity"></typeparam>
5 /// <param name="entity"></param>
6 /// <returns></returns>
7 private Tuple<string, object[]> CreateUpdateSQL<TEntity>(TEntity entity) where TEntity : class
8 {
9 if (entity == null)
10 throw new ArgumentException("The database entity can not be null.");
11 List<string> pkList = GetPrimaryKey<TEntity>().Select(i => i.Name).ToList();
12
13 Type entityType = entity.GetType();
14 var table = entityType.GetProperties().Where(i =>
15 !pkList.Contains(i.Name)
16 && i.GetValue(entity, null) != null
17 && i.PropertyType != typeof(EntityState)
18 && !(i.GetCustomAttributes(false).Length > 0
19 && i.GetCustomAttributes(false).Where(j => j.GetType() == typeof(NavigationAttribute)) != null)
20 && (i.PropertyType.IsValueType || i.PropertyType == typeof(string)) //过滤导航属性
21 ).ToArray();
22
23 //过滤主键,航行属性,状态属性等
24 if (pkList == null || pkList.Count == 0)
25 throw new ArgumentException("The Table entity have not a primary key.");
26 List<object> arguments = new List<object>();
27 StringBuilder builder = new StringBuilder();
28
29 foreach (var change in table)
30 {
31 if (pkList.Contains(change.Name))
32 continue;
33 if (arguments.Count != 0)
34 builder.Append(", ");
35 builder.Append(change.Name + " = {" + arguments.Count + "}");
36 if (change.PropertyType == typeof(string) || change.PropertyType == typeof(DateTime))
37 arguments.Add("'" + change.GetValue(entity, null).ToString().Replace("'", "char(39)") + "'");
38 else
39 arguments.Add(change.GetValue(entity, null));
40 }
41
42 if (builder.Length == 0)
43 throw new Exception("没有任何属性进行更新");
44
45 builder.Insert(0, " UPDATE " + string.Format("[{0}]", entityType.Name) + " SET ");
46
47 builder.Append(" WHERE ");
48 bool firstPrimaryKey = true;
49
50 foreach (var primaryField in pkList)
51 {
52 if (firstPrimaryKey)
53 firstPrimaryKey = false;
54 else
55 builder.Append(" AND ");
56
57 object val = entityType.GetProperty(primaryField).GetValue(entity, null);
58 builder.Append(GetEqualStatment(primaryField, arguments.Count));
59 arguments.Add(val);
60 }
61 return new Tuple<string, object[]>(builder.ToString(), arguments.ToArray());
62
63 }
EF架构~过滤导航属性等,拼接SQL字符串

而对子类公开的Update方法,我们进行了一个封装,它通过操作枚举来确实你是要insert,update还是delete,看代码

EF架构~过滤导航属性等,拼接SQL字符串
 1         /// <summary>
2 /// 执行SQL,根据SQL操作的类型
3 /// </summary>
4 /// <typeparam name="TEntity"></typeparam>
5 /// <param name="list"></param>
6 /// <param name="sqlType"></param>
7 /// <returns></returns>
8 protected string DoSQL<TEntity>(IEnumerable<TEntity> list, SQLType sqlType) where TEntity : class
9 {
10 StringBuilder sqlstr = new StringBuilder();
11 switch (sqlType)
12 {
13 case SQLType.Insert:
14 list.ToList().ForEach(i =>
15 {
16 Tuple<string, object[]> sql = CreateInsertSQL(i);
17 sqlstr.AppendFormat(sql.Item1, sql.Item2);
18 });
19 break;
20 case SQLType.Update:
21 list.ToList().ForEach(i =>
22 {
23 Tuple<string, object[]> sql = CreateUpdateSQL(i);
24 sqlstr.AppendFormat(sql.Item1, sql.Item2);
25 });
26 break;
27 case SQLType.Delete:
28 list.ToList().ForEach(i =>
29 {
30 Tuple<string, object[]> sql = CreateDeleteSQL(i);
31 sqlstr.AppendFormat(sql.Item1, sql.Item2);
32 });
33 break;
34 default:
35 throw new ArgumentException("请输入正确的参数");
36 }
37 return sqlstr.ToString();
38 }
EF架构~过滤导航属性等,拼接SQL字符串
出处:http://www.cnblogs.com/lori/ 欢迎转载

EF架构~过滤导航属性等,拼接SQL字符串的更多相关文章

  1. EF架构~为导航属性赋值时ToList&lpar;&rpar;的替换方案

    回到目录 今天在进行EF开发时,遇到一个问题,在进行join查询时,类中的一个集合类型的导航属性,在给它赋值时,将查询出来的结果ToList()后,出错了,linq to entity不支持这种操作, ...

  2. ASP&period;NET EF 延迟加载,导航属性延迟加载

    ASP.NET EF 延迟加载,导航属性延迟加载   EF(EntityFramework)原理:属于ORM的一种实现 通过edmx文件来查看三部分:概念模型,数据模型,映射关系,上下文DbConte ...

  3. EF Code First 导航属性 与外键(转载)

    EF Code First 导航属性 与外键 一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就 ...

  4. 通过拼接SQL字符串实现多条件查询

    一.通过拼接SQL字符串的方法的好处是: 1.方便查询条件的扩展. 2.简化业务逻辑的判断. 二.例子: 1.界面设计 2.点击查询的代码 /// <summary> /// 按条件查询 ...

  5. 【批量加入】-拼接sql字符串

    如今做的一个项目须要用到批量加入,可是封装的底层没有这种方法,所以自食其力,自己来写.我们用的是拼接sql字符串的方法来实现功能. 详细实现流程:首先将须要的数据存储到实体的list中,然后将这个li ...

  6. SQLServer 存储过程中不拼接SQL字符串实现多条件查询

    以前拼接的写法 set @sql=' select * from table where 1=1 ' if (@addDate is not null) set @sql = @sql+' and a ...

  7. js对象数组中的某属性值 拼接成字符串

    js对象数组中的某属性值 拼接成字符串 var objs=[ {id:1,name:'张三'}, {id:2,name:'李四'}, {id:3,name:'王五'}, {id:4,name:'赵六' ...

  8. 【批量添加】-拼接sql字符串 标签: 批量添加 2015-12-13 17&colon;49 2070人阅读 评论&lpar;33&rpar;

    现在做的一个项目需要用到批量添加,但是封装的底层没有这个方法,所以自食其力,自己来写.我们用的是拼接sql字符串的方法来实现功能. 具体实现流程:首先将需要的数据存储到实体的list中,然后将这个li ...

  9. ASP&period;NET Core EF 查询获取导航属性值,使用Include封装

    // 引用 using Microsoft.EntityFrameworkCore; // 摘要: // Specifies related entities to include in the qu ...

随机推荐

  1. 多兼容的JS获取鼠标坐标

    //第一.相对于屏幕 function getMousePos(event) { var e = event || window.event; return {'x':e.screenX,'y':sc ...

  2. Bootstrap&lt&semi;基础三&gt&semi; 排版

    Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈. 使用 Bootstrap 的排版特性,您可以创建标题.段落. ...

  3. MySQL学习笔记二

    Ø function 函数 函数的作用比较大,一般多用在select查询语句和where条件语句之后.按照函数返回的结果, 可以分为:多行函数和单行函数:所谓的单行函数就是将每条数据进行独立的计算,然 ...

  4. Examples&lowbar;08&lowbar;03

    访问本地程序.http://192.168.1.103/preg_match/test.php,如果换成localhost或者127.0.0.1,则会导致无法访问. http://blog.csdn. ...

  5. Robot Framework自动化测试环境部署

    文档版本:v1.0 作者:令狐冲 如有问题请发邮件到:1146009864@qq.com 使用Robot Framework框架(以下简称RF)来做自动化测试. 模块化设计 1.所需环境一览表 软件 ...

  6. 2015 多校联赛 ——HDU5363(快速幂)

    Problem Description soda has a set S with n integers {1,2,…,n}. A set is called key set if the sum o ...

  7. MySQL之视图、触发器、事务、存储过程、函数 流程控制

    MySQL之视图.触发器.事务.存储过程.函数 阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 MySQL这个软件想将数据处理的所有事情,能够在mysql这个层面上全部 ...

  8. &lbrack;DPI&rsqb;&lbrack;TCP&rsqb; linux API的接口如何控制urgent包的收发

    做DPI,写协议栈的时候,处理到了urgent数据包.突然好奇应用层是如何控制发出urgent包的呢?而接收端又是如何知道,接受到了urgent包的呢? man 7 tcp,中有如下一段: TCP s ...

  9. 第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解

    第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解 封装模块 #!/usr/bin/env python # -*- coding: utf- ...

  10. Maatkit--Mysql的高级管理工具

    Maatkit是不错的mysql管理工具,已经成为Percona的一部分.包含以下主要工具: 1.mk-table-checksum 检查主从表是否一致的有效工具 2.mk-table-sync 有效 ...