加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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 } 
    );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读