5

我的大脑在我需要设置的查询上失败了。

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

public virtual ICollection<Ribbon> Ribbons { get; set; }
public virtual ICollection<Trophy> Trophies { get; set; }

Ribbon 和 Trophy 都有一个名为“UmbracoActivityId”的整数属性。ribbon 和奖杯彼此之间没有直接关系,但它们都与一只猫和一个 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 的奖杯。

我需要在某处反向声明以搜索相反的内容,但我不确定在哪里执行此操作:(

提前致谢。

4

3 回答 3

12

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

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

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

于 2013-03-13T22:44:50.403 回答
4

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

如果任何奖杯共享相同的 UmbracoActivityId,则猫将包括在内。

var ribbons = db.Ribbons
   .Where(ribbon => !db.Cats.Find(ribbon.CatId)
       .Trophies.Any(trophy => trophy.UmbracoActivityId == ribbon.UmbracoActivityId));
于 2013-03-13T22:44:57.867 回答
0
var ribbons = db.Ribbons
   .Where(ribbon => db.Cats.Find(ribbon.CatId)
       .Trophies.All(trophy => trophy.UmbracoActivityId != ribbon.UmbracoActivityId));

我有几种方法可以做到这一点,但是如果没有猫奖杯等于ribbon.UmbracoActivity,这将返回true。

我想你也可以使用 .Exist 和 "==" 。

于 2013-03-13T22:54:22.050 回答