5

セットアップが必要なクエリで頭が混乱しています。

2 つの (関連する) プロパティを持つ Cat オブジェクトがあります。

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

リボンとトロフィーの両方に、"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() ステートメントは true です。私は反対が必要です。「==」を「!=」に変更したくなるかもしれませんが、この場合、猫は異なる UmbracoActivityId を持つ多くのトロフィーを持つことができます。

反対を検索するには、どこかでステートメントを逆にする必要がありますが、どこでそれを行うべきかわかりません:(

前もって感謝します。

4

3 に答える 3

12

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

一致するものがあれば、最初の一致が成功します。それ以外の場合は失敗します。

一致するものがあれば、2 番目の一致は失敗します。それ以外の場合は成功します。

于 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 に答える