2011-11-17 51 views
5

我正在使用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'與提供的類型參數和參數兼容。如果方法是非泛型的,則不應提供類型參數。

沒有人有任何知道我做錯了嗎?或者我只是走錯了方向,我應該嘗試一些其他的方法?哪一個? :)

編輯:改變了我的例子

+0

對不起蔭不知道你是什麼後,你提到的文章還給出了一個答案給你同樣的問題面對避免這種例外。因爲你想遵循這條路線,我真的不明白你在做什麼:)? – user182630

+0

filter.AddCondition( 「項目」, 「含有」, 「百事可樂」); - 這僅適用於和字符串作品,而不是列出和字符串 – Tsabo

+0

@ user182630我希望能夠從子查詢一般由值過濾,不僅爲特定的情況下。那篇文章的方法只適用,如果你硬編碼您的過濾器,這不是我能做的事。 –

回答

2

@ user182630我希望能夠從子查詢中 的值來過濾一般情況下,不僅對一個具體案例。那篇文章 這種方法只適用,如果你硬編碼您的過濾器,這是不是一個東西,我可以做 。 - 馬爾科Juvančič9分鐘前

有一個讀通過這篇文章http://csharpindepth.com/articles/chapter5/closures.aspx

2

我用PredicateBuilder在我的應用程序的動態查詢。

Predicate Builder

在你的情況下,我想這會是這樣的:

string MyCountry = "Austria"; 
string MyProductId = 11 

var Predicate = PredicateBuilder.True<db.Customers>(); 
Predicate = Predicate.And(p=>p.Country ==MyCountry && p.Order.SelectMany(o=>o.Item).Where(i=>i.id == 11).Count() >0); 

var list = Customers.Where(Predicate).Select(s=>s).ToList(); 
+0

這種方法失敗了,「只有在用戶點擊搜索之後才知道要過濾的列」要求。 –

+0

那麼如果所有列提前知道,那麼這是沒有問題的。 – Tsabo

+0

他們不是。方法「應用」過濾器不知道任何有關列。 –