0

私は古典的な3つのテーブル-entity、tag、entitytag-データベース構造を持っています。

特定のタグでタグ付けされたすべてのエンティティを検索するために、次のLinqtosqlコードを使用しています。

string[] myTags = {"tag1","tag2"};

var query = from m in entity
            where m.entitytag.Where(c => myTags.Contains(c.tag.TagName)).Count() == myTags.Count()
            select m;

ただし、エンティティに重複するタグがある場合(実際のアプリではこれには正当な理由があります)、クエリはすべてのタグに一致しないエンティティを返します。

たとえば、上記のコードサンプルでは、​​エンティティが「tag2」ではなく「tag1」で2回タグ付けされている場合、両方のタグが一致していなくても結果に返されます。

これらのエンティティを結果から除外する方法がわかりませんか?

それとも、私が取るべき完全に異なるアプローチがありますか?

4

4 に答える 4

1

代わりに次のクエリを試してください。

                    string[] myTags = { "tag1", "tag2" };
                    var query = from m in entity
                                where myTags.All(tag => m.entitytag.Contains(tag))
                                select m;
                    query.Dump();

All 拡張メソッドは、各タグが含む基準を満たすことを保証するものです。

条件を 1 つだけ満たしたい場合には、Any 拡張メソッドもあります。

それが役に立てば幸い。

カバン

于 2009-05-18T07:36:27.817 に答える
0

に変更してみませんか

where m.entitytag.Distinct().Where(c => ...

これにより、エンティティオブジェクトのサブコレクションから重複するentitytagが削除され、カウントが正しく機能するようになります。

于 2009-05-18T07:33:42.937 に答える
0

試す

string[] myTags = { "tag1", "tag2" };

var query = from e in entity
            where !myTags.Except(from e.tag select e.tag.TagName).Any()
            select e;

アイデアは、エンティティのタグを myTags のコピーから削除することです。その後に残った要素は、エンティティから欠落しているタグに対応します。

ただし、これがどのように機能するかはわかりません。

于 2009-06-04T06:51:50.423 に答える
0

Eoin が提案したように、Distinct() を使用する必要がありますが、entitytag セット全体に対しては機能しません。別の Select ステートメントを使用して実際のタグとのみ比較するのが、ここでのコツです。

    string[] myTags = {"tag1","tag2"};

    var query = from m in entity
    where m.entitytag.Select(et => et.tag.TagName).Distinct().Where(c => myTags.Contains(c)).Count() == myTags.Count()
    select m;

残念ながら、欠点は、これによりパフォーマンスが多少低下することです。

于 2009-05-18T15:10:30.330 に答える