2

次のエンティティがあります。

[Table("Entities")]
public abstract class Entity { 
 public int EntityID { get; set; } 
 public string Description { get; set; }
 public virtual ICollection<Tag> Tags { get; set; }
}

そしてタグエンティティ:

public class Tag {
    public int TagID { get; set; }
    public int EntityID { get; set; }
    public string TagValue { get; set; }
}

上記のように、タグは文字列として保存されるだけで再利用されません。これにより、エンティティがタグを共有しているかどうかを判断するのが少し難しくなりました (そして遅くなりました)。

エンティティにタグのいずれかが含まれているエンティティのリストを返すための作業検索があります。

List<string> searchTags = new List<String> {"test1", "test2"};
entities = (_entityRepository.Entities
            .Where(o=>o.Tags.Any(f=>searchTags.Contains(f.TagValue)));

ここで、リスト内のすべてのタグを含むエンティティのリストも返す必要があります。非プロパティ変数を Contains メソッドに渡すことはできないため、all を使用して呼び出しの順序を逆にすることはできませんが、これは基本的に私が達成しようとしていることです。

entities = (_entityRepository.Entities
            .Where(o=>o.Tags.All(f=>f.TagValue.Contains(searchTags)));

タグのリストでエンティティをフィルタリングするときに一般的なパフォーマンス上の利点を提供するタグを再利用するように DB スキーマを修正する必要があるところまで来たと思いますが、それでも次の質問をしたかったのです。

  1. 私はこれを複雑にしすぎていますか、これを達成する単純なLinqステートメントがありますか、または、
  2. これは、述語ビルダーを使用して基準を設定する必要があるものですか?
4

1 に答える 1

1

これは次のように行うことができます。

var query = _entityRepository.Entities.Select(e => e);
query = searchTags.Aggregate(query, (current, tag) => current.Where(e => e.Tags.Any(t => t.TagValue == tag)));
var result = query.ToList();
于 2013-02-18T19:59:08.453 に答える