以下のサンプル モデルを考えると、その所有者のプロパティで 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))