获取第二个LINQ中不存在的所有记录

时间:2014-02-10 12:21:13

标签: asp.net-mvc linq entity-framework

我想选择第二个linq输出中FeeZoneID不存在的所有记录。

我知道在SQL中可以使用NOT IN(....)轻松完成,但我在LINQ ???

中完成
from d in FeeZones
where d.FeeZoneID !(from b in FeeZoneSchemes
    where b.FeeSchemeID == 1
    join c in FeeZones on b.FeeZoneID equals c.FeeZoneID
    select c)
 select d

在我的C#课中,这就是我的工作方式:

   public IList<FeeZone> _LQ_GetAllAvaliableFeeZoneForGivenFeeSchemeID(int FeeSchemeID)
    {
       using(var db = new QualificationContext())
       {
           var query = (from d in db.FeeZone
                        where (!(from b in db.FeeZoneScheme
                               where b.FeeSchemeID == FeeSchemeID
                               join c in db.FeeZone on b.FeeZoneID equals c.FeeZoneID
                               select c).Contains(d.FeeZoneID))
                       select d).ToList();



           return query.ToList();
       }

    }

这是错误: enter image description here 非常感谢

4 个答案:

答案 0 :(得分:4)

试试这段代码:

var query = from d in FreeZones
            let unwantedZonesIds = FeeZoneSchemes.Where(b => b.FreeSchemeID == 1)
                                                 .Select(b => b.FreeZoneID)
            where !unwantedZonesIds.Contains(d.FreeZoneID)
            select d;

答案 1 :(得分:2)

使用Any代替Contains

var query = (from d in db.FeeZone
                    where (!((from b in db.FeeZoneScheme
                           where b.FeeSchemeID == FeeSchemeID
                           join c in db.FeeZone on b.FeeZoneID equals c.FeeZoneID
                           select c).Any(x => x.FeeZoneID ==d.FeeZoneID))
                   select d).ToList();

答案 2 :(得分:1)

请尝试如下。

from d in FeeZones
where (!(from b in FeeZoneSchemes where b.FeeSchemeID == 1
    join c in FeeZones on b.FeeZoneID equals c.FeeZoneID
    select c.FeeZoneID).Contains(d.FeeZoneID))
 select d

答案 3 :(得分:0)

您可以使用以下查询。

        IList<FeeZones> lst = new List<FeeZones>() { new FeeZones() { FeeZoneID = 1 }, new FeeZones() { FeeZoneID =2 } };
        IList<FeeZoneSchemes> lstnew = new List<FeeZoneSchemes>(){new FeeZoneSchemes(){FeeSchemeID=1,FeeZoneID=1}};


        var res = (from d in lst
                   where !(
                       from c in lstnew 
                       join f in lst on c.FeeZoneID equals f.FeeZoneID
                       where c.FeeSchemeID == 1 && c.FeeZoneID == f.FeeZoneID 
                       select f.FeeZoneID
                   ).Contains(d.FeeZoneID)
                   select d).ToList();

或者您可以使用如下所示的存在查询的Sql方式。

 var res = (from d in lst
                   where !(
                       from c in lstnew 
                       where c.FeeSchemeID == 1 && c.FeeZoneID == d.FeeZoneID 
                       select c
                   ).Any()
                   select d).ToList();