3

以下のサンプル モデルを考えると、その所有者のプロパティで ITEMS をクエリする必要があります。これは Entity Frameworks セットであり、LINQ を使用してこれを行いたいと考えています。

public class Owner
  {
    public int Id { get; set; }
    public string Name { get; set; }
    //More than 20 other properties
  }

  class Item
  {
    public int Id { get; set; }
    public string Description { get; set; }
    public Owner MyOwner { get; set; }
    public int idOwner { get; set; }
    //Several others properties
  }

所有者のフィルターを備えたPredicateBuilderが既にあります。

所有者が述語条件を満たすOwnerすべてのオブジェクトを取得するために、この述語 (基本的には where 句の内容) をオブジェクトに適用したいと思います。Item

所有者のリストの場合Owner...使用できます.Any(predicate)が、そのカーディナリティは1です.

編集:

Owners述語条件を満たすすべての を取得してから を実行する必要がないように、これを実行しようとしていContains(idOwner)ます。

db.Items.Where(c => OwnerIdsCollection.Contains(c.idOwner ?? 0));

私は、関連していない所有者のために内部で作成される大規模な SQL CASE を見てきItemsました。

編集 2 - 述語:

public static Expression<Func<Owner, bool>> GetPredicate(OwnerCriteria criteria)
{
     var predicate = PredicateBuilder.True<Owner>();

     if (criteria.Active.HasValue) {
    predicate = predicate.And(p => p.Active == criteria.Active.Value);
     }
     //Several other criteria checkings as above

    return predicate;
}

条件は、ユーザー フィルターから取得されます。次に、通常は Owners コレクションのクエリに使用しdb.Owners.Where(predicate)ます。

さて、概念的には、次のようなことをする必要があります。 db.Items.Where(x => /*Items filters*/ && x.MyOwner.Where(myOwnerPredicate))

4

1 に答える 1