我有房產和PropertyCompliance實體是這個樣子......重用表達式選擇單
public class Property{
public virtual ICollection<PropertyCompliance> ComplianceRecords {get;set;}
}
public class PropertyCompliance{
public virtual Property {get;set;}
public DateTime ComplianceDate {get;set;}
public ComplianceRating ComplianceValue {get;set;} //just an enum
}
在許多我需要找到PropertyCompliance最接近排至某一特定日期的地方。
var complianceRating = property.ComplianceRecords.OrderBy(cr=>cr.Date)
.Where(cr=>cr.ComplianceDate< checkDate).FirstOrDefault();
我知道我可以使用表達式作爲這樣的過濾ComplianceRecords:
var complianceRating = property.ComplianceRecords.Where(SomeExpression)
.OrderBy(cr=>cr.ComplianceDate).FirstOrDefault()
然而,這是不是真的減少重複的量,因爲所有它做的是更換其中()語句。
有沒有辦法將表達式應用到屬性,以允許此過濾發生在另一個表達式中?喜歡的東西:
private static Expression<Func<Property, ComplianceRating>> PropertyComplianceForDate(DateTime checkDate)
{
return p => p.ComplianceRatings
.OrderByDescending(cr => cr.Date)
.First(cr => cr.Date <= checkDate).ComplianceRating;
}
public Expression<Func<Property, bool>> PropertyIsCompliant(DateTime checkDate)
{
return (p) => PropertyComplianceForDate(checkDate) == ComplianceRating.Compliant;
}
隨着「PropertyComplianceForDate」之處在於可以轉換爲SQL,以允許在SQL還使用了PropertyIsCompliant表達的表達。
這應該可以在下一個版本的實體框架中使用。這個拉取請求昨天被實體框架接受,它實現了你所描述的內容:https://entityframework.codeplex.com/SourceControl/network/forks/BrandonDahler/EntityFramework/contribution/7352#!/tab/comments。基本上,這會檢查表達式中的方法在決定執行還是轉換爲sql之前返回表達式。如果你現在需要使用它,它應該可以在夜間生成:http://entityframework.codeplex.com/wikipage?title=Nightly%20Builds – rdans 2014-11-02 14:55:40
你是否總是需要一個'Property'的記錄,或者你想要一個「屬性」列表中的所有這一個記錄(或沒有)加載在一個查詢?或者我們可以假設物業總是裝載所有'ComplianceRecords'? – 2014-11-02 22:17:16
「PropertyIsCompliant」表達式將用於數據庫中屬性的列表。 var compliantProperties = db.Properties.Where(PropertyIsCompliant); – 2014-11-03 13:36:33