[英]Entity Framework - reusing associated extension methods
我正在嘗試將EF6擴展方法與關聯的實體(一對多關系)重用。 人為的例子:
public class Parent
{
public string State { get; set; }
public ICollection<Child> Children { get; set; }
}
public class Child
{
public string Value { get; set; }
public Parent Parent { get; set; }
}
public static ParentNamedScopes
{
public static IQueryable<Parent> IsReady(this IQueryable<Parent> queryable)
{
return queryable.Where(p => p.State == "Ready" || p.State == "New");
}
}
// ...
var children = db.Children
// my goal, but can't cast Parent to IQueryable<Parent>
// ------------------v
.Where(c => c.Parent.IsReady())
.Where(c => c.Value == "Foobar");
我已經看到了在子查詢中的關聯集合上使用AsQueryable()的示例,但這不是一個選項,因為Parent是單個記錄。 我敢肯定我遺漏了一些明顯的東西,對不起,因為我的Google foo今天還沒有給出答案。
一種選擇是從“父母”開始查詢:
var children = db.Parents.IsReady()
.SelectMany(p => p.Children)
.Where(c => c.Value == "Foobar");
但是, IsReady
會轉換IQueryable的想法對我來說似乎有點IsReady
。 如果您的用例變得更加復雜,則可能需要對其進行更改以僅提供一個Expression<Func<Parent, bool>>
,並使用類似LINQKit的方法來操縱您的查詢以使其可重用:
Expression<Func<Parent, bool>> parentIsReady = ParentCriteria.IsReady();
var readyParents = db.Parents.Where(parentIsReady);
var childrenWithReadyParents = db.Children.AsExpandable()
.Where(c => parentIsReady.Invoke(c.Parent))
.Where(c => c.Value == "Foobar");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.