如何找到相反的.Any()

all*_*.mn 5 .net c# linq

在我需要设置的查询中,我的大脑失败了.

我有一个具有两个(相关)属性的Cat对象:

public virtual ICollection<Ribbon> Ribbons { get; set; }
public virtual ICollection<Trophy> Trophies { get; set; }
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)

我正在接近,但如果功能区有一个具有相同UmbracoActivityId的奖杯,则.Any()语句为真.我需要相反的.将"=="切换为"!="很有诱惑力,但在这种情况下,猫可以拥有许多具有不同UmbracoActivityId的奖杯.

我需要反向声明某处搜索相反但我不知道该去哪做:(

提前致谢.

Pat*_*shu 12

.Any(x == y) - > .All(x != y)

如果有任何匹配,则第一个成功.否则就失败了.

如果有任何匹配,则第二个失败.否则它会成功.


voi*_*hos 5

只需使用否定 - 即Where(ribbon => !db...Any(...))(注意添加的!)。

如果任何奖杯共享相同的 UmbracoActivityId,那么猫将不会被包含在内。

var ribbons = db.Ribbons
   .Where(ribbon => !db.Cats.Find(ribbon.CatId)
       .Trophies.Any(trophy => trophy.UmbracoActivityId == ribbon.UmbracoActivityId));
Run Code Online (Sandbox Code Playgroud)