我有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)在這種情況下是受支持的「
EF轉換任何?如果肯定是更好的解決方案 - 我的appologies。 – Carsten
@Coenoen:我認爲它確實存在,但我不確定。 OP需要測試它。 –
這將是偉大的 - 我有/我的疑惑,因爲你可以在那裏有很多惡作劇,我只是不知道EF走的表達式多深深檢查和翻譯 – Carsten