我有两个集合,这两个集合都有属性电子邮件。我需要在第一个列表中获得电子邮件不存在于第二个列表中的项目列表。对于SQL,我只会使用“not in”,但我不知道在LINQ中等价。怎么做呢?

到目前为止,我有一个连接,比如。

var matches = from item1 in list1
join item2 in list2 on item1.Email equals item2.Email
select new { Email = list1.Email };

但我不能加入,因为我需要的差异和连接将失败。我需要一些方法使用包含或存在我相信。我只是还没有找到这样做的例子。


当前回答

对于那些从一组内存对象开始并对数据库进行查询的人来说,我发现这是最好的方法:

var itemIds = inMemoryList.Select(x => x.Id).ToArray();
var otherObjects = context.ItemList.Where(x => !itemIds.Contains(x.Id));

这就产生了一个很好的WHERE…SQL中的IN(…)子句。

其他回答

“例外”是答案的一部分,但不是全部。默认情况下,Except(像其他几个LINQ操作符一样)对引用类型进行引用比较。要通过对象中的值进行比较,必须这样做

在你的类型中实现IEquatable<T>,或者 在你的类型中重写Equals和GetHashCode,或者 传入一个为你的类型实现IEqualityComparer<T>的类型实例

对于任何想要在c#中使用类似sql的IN操作符的人,请下载这个包:

Mshwf。NiceLinq

它有In和NotIn方法:

var result = list1.In(x => x.Email, list2.Select(z => z.Email));

你也可以这样用

var result = list1.In(x => x.Email, "a@b.com", "b@c.com", "c@d.com");

对于那些从一组内存对象开始并对数据库进行查询的人来说,我发现这是最好的方法:

var itemIds = inMemoryList.Select(x => x.Id).ToArray();
var otherObjects = context.ItemList.Where(x => !itemIds.Contains(x.Id));

这就产生了一个很好的WHERE…SQL中的IN(…)子句。

var secondEmails = (from item in list2
                    select new { Email = item.Email }
                   ).ToList();

var matches = from item in list1
              where !secondEmails.Contains(item.Email)
              select new {Email = item.Email};
 DynamicWebsiteEntities db = new DynamicWebsiteEntities();
    var data = (from dt_sub in db.Subjects_Details
                                //Sub Query - 1
                            let sub_s_g = (from sg in db.Subjects_In_Group
                                           where sg.GroupId == groupId
                                           select sg.SubjectId)
                            //Where Cause
                            where !sub_s_g.Contains(dt_sub.Id) && dt_sub.IsLanguage == false
                            //Order By Cause
                            orderby dt_sub.Subject_Name

                            select dt_sub)
                           .AsEnumerable();
                  
                                SelectList multiSelect = new SelectList(data, "Id", "Subject_Name", selectedValue);

    //======================================OR===========================================

    var data = (from dt_sub in db.Subjects_Details

                               
                            //Where Cause
                            where !(from sg in db.Subjects_In_Group
                                           where sg.GroupId == groupId
                                           select sg.SubjectId).Contains(dt_sub.Id) && dt_sub.IsLanguage == false

                            //Order By Cause
                            orderby dt_sub.Subject_Name

                            select dt_sub)

                           .AsEnumerable();