在我需要设置的查询中,我的大脑失败了.
我有一个具有两个(相关)属性的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的奖杯.
我需要反向声明某处搜索相反但我不知道该去哪做:(
提前致谢.
只需使用否定 - 即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)