c# – Linq使用自定义比较器左外连接
发布时间:2020-12-15 05:39:50 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个左外连接查询,它也有一个自定义比较器. 我有以下列表: ListColumnInformation list1;ListColumnInformation list2; 它们包含有关SQL列(数据类型,名称,表等)的信息.我已经为该类重写了Equals,并创建了一个运算符==和operator!=. 我明白了
我正在尝试创建一个左外连接查询,它也有一个自定义比较器.
我有以下列表: List<ColumnInformation> list1; List<ColumnInformation> list2; 它们包含有关SQL列(数据类型,名称,表等)的信息.我已经为该类重写了Equals,并创建了一个运算符==和operator!=. 我明白了如何make a left outer join: var leftOuterJoin = from l1 in list1 join l2 in list2 on l1.objectID equals l2.objectID into temp from l2 in temp.DefaultIfEmpty(new { l1.ID,Name = default(string) }) select new { l1.ID,ColumnName1 = l1.Name,ColumnName2 = l2.Name,}; 我了解如何制作和使用自定义IEqualityComparer: public class ColumnComparer : IEqualityComparer<ColumnInformation> { public bool Equals(ColumnInformation x,ColumnInformation y) { return x == y; //this uses my defined == operator } public int GetHashCode(ColumnInformation obj) { return 1; //forcing the join to use Equals,just trust me on this } } ColumnComparer cc = new ColumnComparer(); var joinedList = list1.Join(list2,x => x,y => y,(x,y) => new {x,y},cc); 我的问题是:如何同时进行左外连接并同时使用我的比较器? 据我所知,查询语法没有比较器的关键字,扩展方法没有任何关于into关键字的东西. 我不在乎结果是查询语法还是扩展方法. 解决方法
你这样做的方法是使用GroupJoin和SelectMany(以展平结果):
ColumnComparer cc = new ColumnComparer(); var joinedList = list1 .GroupJoin(list2,g) => new {x,g},cc) .SelectMany( z => z.g.DefaultIfEmpty(),(z,b) => new { x = z.x,y = b } ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |