entity framework中怎么通过c 11 lambda表达式式生成sql语句的

随笔- 146&
&&&&&&&&&&&
我们知道lambda表达式在Linq to sql 和 Entity framework 中使用join函数可以实现inner&join,那么怎么才能在lambda表达式中实现left join呢?秘诀就是在join后面加上一个函数DefaultIfEmpty函数,实际上这个函数在linq中貌似也只有将inner&join转换为left&join的作用,示例如下
var joinResult = DB.Table1s.Join(DB.Table2s, a =& a.id, b =& b.id, (a, b) =& new {a,b} ).DefaultIfEmpty();
这样返回的joinResult就包含DB.Table1s left join DB.Table2s的结果了。如果要实现right&join将DB.Table1s和DB.Table2s的位置返过来即可,但是目前似乎在linq lambda表达式中没有很好的办法实现full outer join,如果真的用到了full outer join还是老老实实在数据库写视图或者存储过程等吧。。。
阅读(...) 评论()2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。1784人阅读
ASP.NET精讲(10)
一般来说linq在EF中满足了绝大部分的查询需求,而插入、删除则需要根据实体来操作,在一些情况下会造成一些麻烦。
比如现在有这样的关系:
它在数据库中生成的表:
  那么在实体对象上下文如果想直接操作某些Product与Category的关联时将麻烦不少,因为不能在EF下直接操作ProductCategory中间表。那么这时直接执行SQL语句来添加、删除两者之间关系会好上不少。我便是这样写的:
/// &summary&
/// 添加产品到小类
/// &/summary&
/// &param name=&proID&&产品ID&/param&
/// &param name=&catIDs&&小类ID列表&/param&
public bool AddProductToCategory(int proID, IList&int& catIDs)
bool result = true;
foreach (var catID in catIDs)
string sql = &Insert Into [ProductCategory] Values (@proID,@catID)&;
var args = new DbParameter[] {
new SqlParameter { ParameterName = &proID&, Value = proID},
new SqlParameter(&catID&,catID)
_DataModelEntity.ExecuteStoreCommand(sql, args);
catch (System.Exception ex)
LogHelper.WriteLog(ex);
result = false;
/// &summary&
/// 删除小类产品关系
/// &/summary&
/// &param name=&proID&&产品ID&/param&
/// &param name=&catIDs&&小类ID&/param&
public bool DeleteProductToCategory(int proID,IEnumerable&int& catIDs)
bool result = true;
foreach (var catID in catIDs)
string sql = &Delete From [ProductCategory] Where [Product_ID] = @proID And [Category_ID] = @catID&;
var args = new DbParameter[] {
new SqlParameter { ParameterName = &proID&, Value = proID},
new SqlParameter(&catID&,catID)
_DataModelEntity.ExecuteStoreCommand(sql, args);
catch (System.Exception ex)
LogHelper.WriteLog(ex);
result = false;
  实际上已经有不少博文中提到了这些使用方法,这里我只是强调它的使用条件,大部分环境下,LINQ和EF的配合已经趋于完美了。
  转载请注明原址:&
从Entity Framework 4开始在ObjectContext对象上提供了2个方法可以直接执行SQL语句:ExecuteStoreQuery&T& 和
ExecuteStoreCommand。
1、使用ExecuteStoreQuery&T& :通过sql查询返回object实体,有有许多需要注意:
1.sql = &select * from Payment where Vendor= @vendor&;之所以能写成select *是因为Payment对象的属性和表的字段命名完全一致,如果不一致的话,需要将表字段取别名,别名需是对象映射的属性名称。
2.如果sql语句返回的列少于(具体化)实体的属性的个数,那么EF在具体化的时候将抛出一个异常如下图,因此将需要缺少的列补上一些没有意义的值,以保证在具体乎的时候不会报错:eg 如图1,如果sql=”select PaymentId ,Amount from Payment ” 这样使用context.ExecuteStoreQuery&Payment &(sql, args);那么会报异常,因此需要将Vendor 列补上 。正确的sql=”select PaymentId ,Amount, null
as Vendor from Payment”。
3.如果sql 返回的列 多余具体化的实体属性的个数,那么EF将会忽视多出的列。
4.如果是你返回的表是映射到几个继承关系的实体类上,那么返回的行需要具体化到几个实体上,EF是无法根据识别列来将返回的行具体化到相应的继承类型上去,这是EF会抛出一个运行时的exception
5.如果实体有complex Type属性,那么实体对象的实例是无法用ExecuteStoreQuery()来返回的,因为ExcuteStoreQuery()是无法返回一个complex Type的集合的.返回单个complex type是支持的,但是返回的实体对象里包含complex type就不支持。
6.可以返回实体对象属性的子集,就是说如果对于Payment表,我们查询返回PaymentId和Amount字段,然后我们定义一个subPayment 实体包含PaymentId和Amount属性,然后使用ExcuteStoreQuery&subPayment&()
2、使用ExecuteStoreCommand:这个更加灵活,你可以执行Update,Insert,Delete语句。
using (SzmbEntities entity = new SzmbEntities())
var item = entity.Weatherwarnings.OrderByDescending(x=&x.Id)
.Where(x =& x.PublishTime & now.AddDays(-14))
.FirstOrDefault();
if (item != null)
&&&&&&&&& {
string sql = &Delete FROM [Weatherwarning] where Id & @ID&;
var args = new DbParameter[] {
new SqlParameter { ParameterName = &ID&, Value = item.Id}
&&&&&&&&&&&&&&&& };
entity.ExecuteStoreCommand(sql,args);
&&&&&&&&&& }
ExecuteStoreCommand()返回一个int值,影响的行数。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:27796次
排名:千里之外
原创:12篇
转载:16篇
(5)(7)(1)(2)(3)(1)(1)(2)(1)(4)(3)linq 中使用 Lambda表达式 函数如何用 - LINQ当前位置:& &&&linq 中使用 Lambda表达式 函数如何用linq 中使用 Lambda表达式 函数如何用,网友分享于:&&&浏览:42次linq 中使用 Lambda表达式 函数怎么用如题想要在linq 中使用 Lambda表达式并用使用sql函数,这个应该怎么写。------解决方案--------------------sql函数要如在EF一样,映射成实体类方法才方便好用.跟调用一般方法差不多http://blog.csdn.net/jameszhou/article/details/4462283
------解决方案--------------------SQL中的 在存储过程 函数 方法 在映射DBML时可一同映射通过DataContxt直接点出来掉用
------解决方案--------------------探讨SQL中的 在存储过程 函数 方法 在映射DBML时可一同映射通过DataContxt直接点出来掉用
------解决方案--------------------自己定义的SQL函数可以直接“导入”进来生成的.Net中的函数的原生的函数可以使用System.Data.Linq.SqlClient.SqlMethods
------解决方案--------------------where(c=&c.date&beginDate && c,date&endDate)不知道这么对不对
------解决方案--------------------where(c=& (c.date&beginDate) && (c.date&endDate))注意数据类型
------解决方案--------------------对啊,存储过程经过映射之后会直接在映射文件中存在然后再直接调用@@@@@
------解决方案--------------------初学者,学习ing...... 相关解决方案暂无相关解决方案 12345678910
12345678910
12345678910 上一篇:下一篇:Copyright & &版权所有Lambda表达式转SQL语句类库 - C#技巧 - 大学IT网
当前位置: >
> Lambda表达式转SQL语句类库
关键词:&&阅读(2770) 赞(11)
[摘要]本文是对Lambda表达式转SQL语句类库的讲解,对学习C#编程技术有所帮助,与大家分享。
/* 作者:道法自然 * 个人邮件:* */Lambda表达式转SQL语句类库源码下载:http://download.csdn.net/detail/xftyyyyb/8044085一、可以达到的功能本功能类库主要提供给代码中使用Lambda表达式,后需转成SQL的条件语句这一需求。二、不能做的1、本类库不能解析Linq语句;2、不能解析SQL中的Select部分;三、案例:1、以Northwind数据库Customers表为例,为使问题简单,仅用部分字段演示/// &summary&/// 客户管理/// &/summary&public class Customers{/// &summary&/// 客户ID/// &/summary&public string CustomerID { }/// &summary&/// 公司名称/// &/summary&public string CompanyName { }/// &summary&/// 地址/// &/summary&public string Address { }}2、可能会有如下方法访问数据库public static Customers Data_Fetch(string aiWhere, string aiOrderBy){var cnstr = ConfigurationManager.ConnectionStrings["DemoConnectionString"].ConnectionSCustomers aiCustomers = new Customers();StringBuilder aisd = new StringBuilder();using (SqlConnection cn = new SqlConnection(cnstr)){#region 数据访问#region 查询SQL语句aisd.Append(" SELECT ");aisd.Append(" CustomerID,CompanyName,Address ");aisd.Append(" FROM Customers ");aisd.Append(aiWhere);aisd.Append(aiOrderBy);#endregioncn.Open();using (SqlCommand cmd = new SqlCommand(aisd.ToString(), cn)){using (SqlDataReader myDataReader = cmd.ExecuteReader()){if (myDataReader.HasRows){myDataReader.Read();aiCustomers = new Customers{#region 类赋值CustomerID = (string)myDataReader["CustomerID"],CompanyName = (string)myDataReader["CompanyName"],Address = (string)myDataReader["Address"]#endregion};}};}#endregion}return aiC}3、构建一个表达式方法public static class DbCustomersTest{/// &summary&/// 构建一个表达式方法 /// &/summary&/// &param name="aiExp"&表达式&/param&/// &returns&&/returns&public static Customers GetCustomers(Expression&Func&IQueryable&Customers&, IQueryable&Customers&&& aiExp){AiExpConditions&Customers& expc = new AiExpConditions&Customers&();expc.Add(aiExp);return Customers.Data_Fetch(expc.Where(), expc.OrderBy());}}4、调用用例测试Customers aic = DbCustomersTest.GetCustomers(c =& c.Where(o =& o.CustomerID == "ALFKI"));Customers aic2 = DbCustomersTest.GetCustomers(c =& c.Where(o =& o.CustomerID.Contains("CO")).OrderBy(o=&panyName));
相关C#技巧推荐

我要回帖

更多关于 jdk1.8 lambda表达式 的文章

 

随机推荐