我正在使用Dynamic LINQ Library進行篩選的大型應用程序。使用動態LINQ在子查詢上進行篩選
所有我的數據訪問層中的類都從一個共同的祖先DALAncestor其中,除其他事項外,定義方法的GetData導出:公共抽象列表的GetData(過濾器過濾)
用於該方法的一個實施一個客戶是這樣的(簡化):
public override List<Entities.Customer> GetData(Filter filter) {
var customers = from c in db.Customers
select new Entites.Customer {
ID = c.ID,
FullName = c.Name,
Country = c.Country
};
return = filter.Apply(customers).ToList();
}
「應用」是需要條件的集合,並且使用動態LINQ Libary適用所有的人的方法。
方法的GetData被稱爲像這樣:
private void DemoCallGetDataMethod() {
var filter = new Filter();
filter.AddCondition("Country", "Austria");
var list = myCustomerDAL.GetData(filter);
// do something
}
SQL Server獲取一個選擇statment:
SELECT [t0].ID, [t0].Name, [t0].Country
FROM Customer [t0]
WHERE [t0].Country = @p0
(@ P0是它的值設置爲 「奧」 的參數)。
如果我只想過濾「頂級」(主)級別的值,一切都很好。但是,由於我在篩選器表單上的用戶輸入上構建了篩選器,因此有些情況下用戶希望按詳細級別的值進行篩選(即只有在用戶單擊「搜索」後才知道要篩選的列)。
我無法找到一個解決方案:「讓所有來自奧地利的客戶,誰買百事可樂」。
我已經嘗試了幾件事情,其中沒有一件似乎工作。其基本思想是:
1. Add support for CONTAINS到DynamicLibrary
2.更改我的代碼
public override List<Entities.Customer> GetData(Filter filter) {
var customers = from c in db.Customers
select new Entites.Customer {
ID = c.ID,
FullName = c.Name,
Country = c.Country,
Items = c.Order.SelectMany(o => o.Item).Select(i => i.ItemId).ToList()
};
return = filter.Apply(customers).ToList();
}
private void DemoCallGetDataMethod() {
var filter = new Filter();
filter.AddCondition("Country","=", "Austria");
filter.AddCondition("Items","Contains", "11"); // 11 = Id for Pepsi
var list = myCustomerDAL.GetData(filter);
// do something
}
拋出的exepction是:在沒有通用方法 '包含':
System.InvalidOperationException類型'System.Linq.Enumerable'與提供的類型參數和參數兼容。如果方法是非泛型的,則不應提供類型參數。
沒有人有任何知道我做錯了嗎?或者我只是走錯了方向,我應該嘗試一些其他的方法?哪一個? :)
編輯:改變了我的例子
對不起蔭不知道你是什麼後,你提到的文章還給出了一個答案給你同樣的問題面對避免這種例外。因爲你想遵循這條路線,我真的不明白你在做什麼:)? – user182630
filter.AddCondition( 「項目」, 「含有」, 「百事可樂」); - 這僅適用於和字符串作品,而不是列出和字符串 –
Tsabo
@ user182630我希望能夠從子查詢一般由值過濾,不僅爲特定的情況下。那篇文章的方法只適用,如果你硬編碼您的過濾器,這不是我能做的事。 –