2010-04-18 57 views
10

我有一個如何在運行時從文本構建LINQ查詢?

class A { 
    public int X; 
    public double Y; 
    public string Z; 
    // and more fields/properties ... 
}; 

List<A> data和可以建立LINQ查詢像例如

var q = from a in data where a.X > 20 select new {a.Y, a.Z}; 

Then dataGridView1.DataSource = q.ToList();在我的DataGridView中顯示選擇。

現在的問題是,有可能從用戶在運行時輸入的文本構建查詢?像

var q = QueryFromText("from a in data where a.X > 20 select new {a.Y, a.Z}"); 

問題是,用戶(有編程技能)可以動態和自由地選擇顯示的數據。

回答

4

那麼,你可以使用CSharpCodeProvider在執行時編譯代碼。請看Snippy這個例子。在這種情況下,您需要在接受List<A>(稱爲data)的方法中編譯用戶代碼。我的經驗是,它的工作原理,但它可以稍微繁瑣得到的權利 - 尤其是在加入適當的引用等方面

+3

+1,但會關注編譯和執行任意代碼。將需要盡職調查,並做了這樣的事情,我說這是沒有趣味,會困擾你的夢想。 ;-) – 2010-04-18 08:36:36

5

Dynamic Linq寶貝!

r.e.評論。

是的,使用Dynamic Linq可能無法使用書寫的示例,但是如果您將常量分解,例如'從數據'中,你留下了一個'where'和一個'select',可以用動態linq來表示。

所以兩個文本框,也許三個,如果你包括orderby,可能會滿足你的要求。

只是一個想法。

喬恩有一個有趣的方法,但我會對編譯和執行不受限制的代碼持懷疑態度。

+0

我不明白Dynamic Linq如何實現這一點。 – Danvil 2010-04-18 08:20:15

+0

@Danvil - 你是對的,你寫的例子可能是不可能的,但是當你將諸如......地獄之類的常量分解出來時,我只是編輯答案。 – 2010-04-18 08:31:35

0

雖然可能有一些方法可以做到這一點,LINQ根本不適合這個場景。使用CodeDOM(正如Jon所建議的)可能是輕鬆完成這一任務的唯一方法。如果您信任用戶並且他/她具有編程技能,那麼您可以使用舊式方法並讓用戶使用SQL輸入查詢?

另一方面,如果您選擇創建一些可視化工具來構建查詢,則不需要通過編寫字符串來構建它們,而是可以編寫表達式樹。例如使用Linq KitAsExpandable

+0

我有一個類的形式,而不是在數據庫中的數據。我雖然通過使用LINQ,但我也許可以在類上實現類似的交互式查詢行爲 - 就像SQL查詢可以在數據庫上執行一樣。 – Danvil 2010-04-19 07:58:27

1

接聽它非常晚;不過,它會幫助訪問此頁面的用戶。

我有類似的要求,我解決它通過動態編譯字符串作爲LINQ查詢,在內存中的集合執行它,並收集結果。只有捕獲是用戶輸入需要有效的C#可編譯代碼否則它會返回一個異常消息,而不是結果。

代碼是很長,所以這裏是在GitHub上github link

示例應用程序顯示多個例子包括投影。