我想选择第二个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();
}
}
这是错误: 非常感谢
答案 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();