2012-03-21 82 views
1

我想用System.Linq.Dynamic動態查詢一個對象。動態LINQ可以與實體複雜類型兼容嗎?

var selectData = (from i in data 
         select i).AsQueryable().Where("Name = @0","Bob1");//This works fine with a non-entity object 

know我們不能投影到映射實體上。我認爲,這是代碼失敗

 foreach (var item in rawQuery.ObsDataResultList) 
     { 
      var propertyData = (from i in item 
           select i).AsQueryable().Where("PropertyName = @0", "blah"); 
     }//item is a Entity Complex Type 

錯誤的原因

找不到 源型「ClassLibrary1.Model.bhcs_ObsData_2_Result」的查詢模式的實現。 '選擇'不是 找到。

鑑於我需要在運行時指定PropertyName,我沒有看到用匿名類型或DTO投影的任何方法。

此時我不需要保留任何實體功能,我只需要這些數據。將數據複製到可查詢的內容是一個有效的解決方案。那麼,是否有可能使用動態LINQ查詢實體框架?

這裏是實體類的頭(我想查詢的東西,又名項目對象)

[EdmComplexTypeAttribute(NamespaceName="MyDbModel", Name="blah_myQuery_2_Result")] 
[DataContractAttribute(IsReference=true)] 
[Serializable()] 
public partial class blah_myQuery_2_Result : ComplexObject 
{ 
+0

我對此感興趣,因爲我還沒有對動態linq有所瞭解。但我必須說(純粹是主觀地,作爲風格問題),我發現將查詢理解與方法調用混合在同一個表達式中會讓人困惑,特別是如果查詢理解是來自數據選擇i中的簡單'。我認爲如果你改變'(從我在數據中選擇i).AsQueryable()'到'data.AsQueryable()',你會發現代碼更易於維護。 – phoog 2012-03-21 21:16:26

回答

2

首先,讓我澄清System.Linq.Dynamic不是一個完整的Microsoft產品。這只是我們前段時間發佈的一個示例,並且我們沒有徹底測試不同的LINQ實現以正確使用它。如果您正在尋找EF ObjectContext API完全支持的基於文本的查詢語言,則應該查看實體SQL。除此之外,如果你想使用System.Linq.Dynamic,並且你自己測試你沒有碰到任何會阻止你的應用程序工作的東西,那麼我會試着看看我能不能幫忙。我將需要額外的信息,因爲我不確定我瞭解代碼片段中的所有內容。

首先,我想在第一個例子中瞭解什麼是「數據」,它來自哪裏?在你的第二個片段中,什麼是「rawQuery」,它來自哪裏? Besdies,什麼是rawQuery.DataResultList和什麼是rawQuery.ObsDataResultList?

另外,關於你的第二個片段,似乎您試圖用查詢運營商組成的一個對象,它實際上不是一個查詢類型的頂部(儘管這並不能解釋的錯誤你得到因爲你是調用AsQueryable之前,編譯器應該抱怨bhcs_ObsData_2_Result不是IEnumerable,也不是非泛型IEnumerable)。

在你提出的答案中,你說你用ObjectResult嘗試過,似乎有幫助。請注意,ObjectResult不是查詢對象,因此它不會允許您構建發送到服務器的查詢。換句話說,您應用於ObjectResult的任何查詢運算符都將在內存中進行評估,如果您不記住這一點,則可能最終會在應用任何篩選之前將該表中的所有數據存入內存。

+0

'data'表示一個模擬對象查詢。 'rawQuery'是自定義類的對象實例。該類有4個'List 類型的成員('DataResultList','ObsDataResultList')。它來自DL中的讀取操作。 DL根據一些參數查詢一組存儲過程。參數在示例代碼之前執行過濾。所以,我並不擔心在內存中加載整個表,也就是延遲執行這種情況。儘管這是一個很好的考慮點。 – 2012-04-18 14:13:12

0

查詢ObjectResult<blah_myQuery_2_Result>,而不是直接的項目blah_myQuery_2_Result。例如

var result = (from i in rawQuery.DataResultList 
          select i).AsQueryable().Where("CreatedDTM > @0", DateTime.Now.Subtract(new TimeSpan(30, 0, 0, 0)));