在我需要设置的查询中,我的大脑失败了。
我有一个具有两个(相关)属性的Cat对象:
public virtual ICollection<Ribbon> Ribbons { get; set; }
public virtual ICollection<Trophy> Trophies { get; set; }
Ribbon和Trophy都有一个名为“UmbracoActivityId”的整数属性 缎带和奖杯并没有直接相关,但它们都与猫和UmbracoActivity有关。猫为UmbracoActivity完成的每个“步骤”获得一条色带,并完成所有步骤的奖杯。他们是非常有竞争力的猫:)。
我需要做的是获得已经开始UmbracoActivity但尚未完成所有步骤(没有获得奖杯)的猫的数量。
用简单的英语:找到所有不同的色带,其中带有色带的猫没有与色带的UmbracoActivityId具有相同UmbracoActivityId的奖杯。
我在代码中得到了什么:
var ribbons = db.Ribbons
.Where(ribbon => db.Cats.Find(ribbon.CatId)
.Trophies.Any(trophy => trophy.UmbracoActivityId == ribbon.UmbracoActivityId));
我越来越接近但如果功能区有一个具有相同UmbracoActivityId的奖杯,则.Any()语句为真。我需要相反的。将“==”切换为“!=”很有诱惑力,但在这种情况下,猫可以拥有许多具有不同UmbracoActivityId的奖杯。
我需要反过来某处搜索相反的声明,但我不知道该怎么做:(
提前致谢。
答案 0 :(得分:12)
.Any(x == y)
- &gt; .All(x != y)
如果有任何匹配,则第一个成功。否则就失败了。
如果有任何匹配,则第二个失败。否则它会成功。
答案 1 :(得分:4)
只需使用否定 - 即Where(ribbon => !db...Any(...))
(请注意添加的!
)。
如果任何奖杯共享相同的UmbracoActivityId,那么猫将不包括在内。
var ribbons = db.Ribbons
.Where(ribbon => !db.Cats.Find(ribbon.CatId)
.Trophies.Any(trophy => trophy.UmbracoActivityId == ribbon.UmbracoActivityId));
答案 2 :(得分:0)
var ribbons = db.Ribbons
.Where(ribbon => db.Cats.Find(ribbon.CatId)
.Trophies.All(trophy => trophy.UmbracoActivityId != ribbon.UmbracoActivityId));
我猜想有几种方法可以做到这一点,但如果没有猫奖杯等于ribbon.Umbraco活动,则返回true。
我也可以使用.Exist和“==”。