2014-11-02 92 views
0

尋找創建一種通用查詢生成器,其中通過導航屬性具有相關實體。所以我想能夠這樣說:相關實體的Lambda表達式樹

var results = from entityA in context.entityAs 
where entityA.NavigationPropertyB.PropertyZ = value1 
group entityA by entityA.NavigationPropertyC.PropertyY into g 
select new { propertyY = g.Key, value = g.OperatorD(x=>x.PropertyX)} 

其中entityA,相關的屬性和運營商可以在飛行中提供。我正在考慮爲給定的實體類型獲取屬性的集合,並使用它們來構建動態查詢的lambda表達式樹。

a)這是否有效?這是否明智?

b)是否有一種簡單的方法可以獲得我想要查詢的所有屬性的單個集合,包括相關實體的屬性n遠離entityA的關係的數量?

c)查詢樹在運行時傳入的相關實體的外觀如何?

+0

我肯定會從Dynamic Linq開始。優點是已經實施。查詢作爲字符串傳遞,因此您的動態where子句將是'.Where(「NavigationProperty.PropertyZ = \」value1 \「」)''。 – 2014-11-02 20:21:14

回答

0

好吧,我做了類似的事情。我已經使用了LINQ表達式(System.Linq.Expressions命名空間),並且我也創建了一個小解析器。

我花了一些時間,但我非常滿意,它是整個應用程序的跳動心臟,所以是的,它的工作原理,它是明智的。你可以通過LINQ表達式創建(表達),因爲編譯器無論如何都是這樣的。不管你在VS編輯器的代碼中寫什麼,你都可以通過LINQ表達式來創建(表達)。有些方法比較像Where()或Count()更容易,有些更像Join()或GroupBy(),但在一天結束時就可以完成。

c) 無論您是靜態編寫查詢還是在運行時動態構建它,表達式樹看起來都是相同的,只有在實現時纔會評估。

下面是一個例子:

string query = "db.Documents.Count() != 0 ? db.Documents.Where(d => d.No == 176).Items.Select(a => a.Debit).Sum() : 0"; 
var result = ExprBuilder.DoExpression(new MyDbContext(), query); 

因此,基本上,它不是很容易的,它可能不值得花時間(取決於你有多需要它),但它可以完成,可以來非常方便。