2011-09-02 94 views
0

我有KeyValuePairs的一個這樣的數組:Lambda表達式用於查詢使用表達式KeyValuePairs的陣列<Func鍵<T, bool>>

KeyValuePair<long,int>[] orderItems; 

此KeyValuePair的「長」分量對應於一個Id(主鍵)值在數據庫表上。

使用實體框架,我已經定義了一個儲存庫,其提供其接口上的方法如下:

IEnumerable<T> GetMany(Expression<Func<T, bool>> where);  

上述存儲庫的方法允許使用我lambda表達式來查詢數據庫。例如,如果我想查詢所有行的數據庫所在的「類別」列等於「相機」我可以這樣說:

var results = repository.GetMany(a => a.Category.Contains("Cameras")).ToList(); 

我想查詢的所有行ID(主鍵)等於KeyValuePairs數組中任何元素的Key值。因此,如果KeyValuePairs的列表是產品ID及其數量的列表,我只想查詢數據庫中所有Id在我的數組中的產品。

任何人都可以創建適當的lambda表達式嗎?

* *編輯原始

的建議使用:

var results = repository.GetMany(a => keys.Any(x => x == a.Id)).ToList(); 

是一個很好的,如果我第一次創建從KeyValuePair陣列中的鍵的陣列將起作用。所以像這樣:

long[] pids = new long[orderItems.Length]; 

for (int i = 0; i < orderItems.Length; i++) 
{ 
    pids[0] = orderItems[i].Key; 
} 
var products = productRepository.GetMany(a => pids.Any(x => x == a.Id)).ToList();  

這表明'任何'條款是由EF支持。儘管如此,如果不使用long數組,我仍然無法工作。對任何足夠聰明的人都可以提供一個解決方案,而不需要我先將KeyValuePair中的'key'值提取到數組中。

如果我使用keys.Any我得到下面的異常:

「無法創建類型的常量值‘System.Collections.Generic.IEnumerable`1’只有原始類型(如的Int32,字符串和Guid)在這種情況下是受支持的「

回答

1

在這種情況下,使用EF執行GetMany方法時很難使用GetMany方法。 但是你應該有一個查詢 - 以你的實體命名的對象 - 我在這裏把類別(作爲一個帶有字段/屬性Id的Type的可查詢對象)作爲例子。然後,你可以這樣做:

var query = context.Categories; 
foreach(var pair in orderedItems) 
    query = query.Union(context.Where(categorie => categorie.Id = pair.Key)); 

,最後使用查詢:

var results = query.ToList(); 

PS:使用此與您的存儲庫模式,你可以只是你的資料庫界面中公開該可查詢收集如IQueryable的(或從通用存儲庫例如ICategoryRepository)

1

做出繼承接口試試這個:

var keys = orderItems.Select(x => x.Key).ToList(); 
var results = repository.GetMany(a => keys.Any(x => x == a.Id)) 
         .ToList(); 
+0

EF轉換任何?如果肯定是更好的解決方案 - 我的appologies。 – Carsten

+0

@Coenoen:我認爲它確實存在,但我不確定。 OP需要測試它。 –

+0

這將是偉大的 - 我有/我的疑惑,因爲你可以在那裏有很多惡作劇,我只是不知道EF走的表達式多深深檢查和翻譯 – Carsten

相關問題