2015-02-23 42 views
0

我正在構建使用Linq實體和​​表達式樹的高級搜索功能。我有兩個實體,實體A和實體B,其中A是父項,並且與B具有一對多關係。表達式樹多個實體

我已經爲實體A中的字段完成了表達式樹,並且Linq查詢按預期工作。我想添加的是一個功能,我可以查詢返回Entity A記錄,其中實體B中的字段包含一些文本。

我發現有足夠的提示可以確信我可以做到這一點,但我試圖將它全部放入一棵樹中,以便我可以累積過濾。所以我想說或多或少:

SELECT * 
FROM EntityA EA 
WHERE EA.FieldA = 'exampleinsql' 
AND 'test' in (SELECT EB.FieldB 
       FROM EntityB EB 
       WHERE EntityB.EntityAForeignKey = EA.ID) 

如果有道理?

我在做什麼目前正在通過過濾器對象的列表,然後一起使用下面的代碼snippits結合了一堆表現形式:

Expression expBody = ParseOperator(
     Expression.Property(pe, filtersList.FirstOrDefault().FieldName), 
     filtersList.FirstOrDefault().Operator, 
     Expression.Constant(filtersList.FirstOrDefault().GetTypedValue())); 
expBody = Expression.AndAlso(expBody, newExp); 

正如我提到,這對主要實體列的偉大工程。我的理解是,對於EntityB我需要創建一個Lambda表達式來添加到此。我在正確的軌道上嗎?任何人有任何想法?

+0

因此,在對此進行了額外的研究後,我意識到我正在重新發明輪子,並通過重新創建這個過程的一半:https://petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/ 想要嘗試一下,看看我能否按我需要的方式工作。 – yanbu 2015-02-23 23:29:38

回答

0

你根本不需要操縱表達式。只要使用正規的lambda表達式編寫一個查詢是這樣的:

var query = from a in context.EntityA 
    where a.FieldA == "exampleinsql" && 
     context.EntityB.Where(b => b.EntityAForeignKey == a.ID) 
     .Select(b => b.FieldB) 
     .Contains("test") 
    select a; 

當然,你可以或者只是這樣的查詢做了Join

+0

您需要在'Where'後面選擇'Contains '。 – MarcinJuraszek 2015-02-23 22:18:45

+0

我開始使用表達式樹的路線的原因是我試圖讓它可以跨幾個不同的實體重用。我不希望在linq查詢中包含多個Wheres以避免使其具體化。 – yanbu 2015-02-23 22:24:37

+0

@MarcinJuraszek編輯,謝謝。 – Servy 2015-02-24 14:56:09