linq 的 left join 如何優化寫法.

chaojie_sea 2014-07-10 11:52:27
如:

DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
dt1.Columns.Add("matcode", typeof(System.String));
dt1.Columns.Add("matsize", typeof(System.Decimal));
dt1.Columns.Add("matsunit", typeof(System.String));
dt1.Columns.Add("matcolor", typeof(System.String));
dt1.Columns.Add("asn_sqty", typeof(System.Decimal));
//
dt2.Columns.Add("matcode", typeof(System.String));
dt2.Columns.Add("matsize", typeof(System.Decimal));
dt2.Columns.Add("matsunit", typeof(System.String));
dt2.Columns.Add("matcolor", typeof(System.String));
dt2.Columns.Add("asn_sqty", typeof(System.Decimal));
//
var res1 = from r1 in dt1.AsEnumerable()
join r2 in dt2.AsEnumerable() on new
{
matcode = r1.Field<string>("matcode").Trim(),
matsize = r1.Field<decimal>("matsize"),
matsunit = r1.Field<string>("matsunit").Trim(),
matcolor = r1.Field<string>("matcolor").Trim(),
} equals new
{
matcode = r2.Field<string>("matcode").Trim(),
matsize = r2.Field<decimal>("matsize"),
matsunit = r2.Field<string>("matsunit").Trim(),
matcolor = r2.Field<string>("matcolor").Trim(),
} into g1
from r2 in g1.DefaultIfEmpty()
where r1.Field<decimal>("asn_sqty") != (r2 == null ? 0 : r2.Field<decimal>("asn_sqty"))
select new
{
matcode = r1.Field<string>("matcode").Trim(),
matsize = r1.Field<decimal>("matsize"),
matsunit = r1.Field<string>("matsunit").Trim(),
matcolor = r1.Field<string>("matcolor").Trim(),
asn_sqty1 = r1.Field<decimal>("asn_sqty"),
asn_sqty2 = r2 == null ? 0 : r2.Field<decimal>("asn_sqty"),
isAct = r2 == null ? 1 : 2,
};

這里如何優化下寫法,可以不用寫那麼多條件(equals 那裡,或者全部幫我重新寫過)。
如資料說:
如果有复杂的比较需求,建议自定义一个类型来作为比较键,用一个方法来获取:
from element1 in set1 join element2 in set2 on element1.GetKey() equals element2.GetKey()
小贴士:GetKey()可以是一个扩展方法。
問題點是:
如何寫這個GetKey() 方法.
謝謝!

...全文
99 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
四个对比字段不算多。
DNetORM源码 源码描述: 一、源码介绍 1、DNetORM 是一款基于.net的轻量级的、轻配置的ORM框架,核心代码只有100K大小,支持SQLSERVER、MYSQL、ORACLE数据库,DNetORM的核心思想是,将最接近原生的C#代码映射出最符合场景的sql语句,从而最大程度提升开发效率。 2、为什么要开发一款orm框架,笔者在开发的这些年里,使用了很多框架,有第三方的譬如mybatis、nhibernate、ef等等,但是它们都不符合我的开发习惯,首先我喜欢轻配置,不喜欢将大量的sql语句写在配置文件里,也不喜欢将实体映射关系写在配置文件里,所以像mybatis、nhibernate这种重配置的orm我并不喜欢,EF算是一个功能强大的框架,但是EF也有一些缺陷,过于笨重,另外EF对于mysql、oracle的支持并不友好。另外还有一些其他框架接口封装的不友好、要么写法过于繁琐、要么接口不清晰,这些因素都是促使我写一个符合我的开发场景的orm 3、DNetORM使用起来非常简单,DNetORM拒绝封装过多的方法,这会造成使用的难度,只是封装了增删改查基本常用的一些方法,所以使用起来会非常简单。 4、DNetORM对于多表的联查进行了常规的封装支持了LEFT JOIN, INNER JOIN ,GROUP BY , ORDER BY, WHERE,对于复杂的写法,建议使用DNetORM提供的SQL查询接口,我们在开发中使用orm是为了提升开发效率,节省开发时间,这是为什么使用orm的目的,orm不是为了避免使用sql,实际开发中有很多查询语句会很复杂,如果依赖orm,首先orm即使支持的话也会写的很复杂,并不直观,以往有开发的筒子们在用linq实现相同的复杂一点的sql的时候,写个sql也就是5分钟,但是为了实现linq的写法写了半小时,还写的不正确,所以这些都是违背开发精神的。所以ORM是一个开发工具,它的出现就是为了节省开发时间、提升开发效率,使用orm可以帮你解决增删改的繁杂琐事,在查询上,orm帮你处理了大部分的单表查询,在多表的查询上,orm帮你处理简单的多表查询,帮你最快的获取数据,至于复杂的sql查询,直接使用sql查询接口。也许这种做法更加合理。 二、注意事项 1、开发环境为Visual Studio 2015,使用.net 4.0开发。

111,088

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧