2011-09-14 67 views
1

我在找寫與LINQ或表達式目錄樹查詢,根據動態輸入返回一個動態結果最好的方式動態結果。例如,考慮這個僞代碼:最好的方法寫動態查詢與使用LINQ或表達式樹

CREATE PROCEDURE Test 
@Input  NVARCHAR(50) 
AS 
BEGIN 
DECLARE @Query  NVARCHAR(100); 
SET @Query=N'SELECT ' + @Input + ' FROM MyTable' 

EXEC @Query 
END 

什麼是最好的辦法:

  1. 這個代碼使用LINQ或表達式樹
  2. 調用此作爲使用LINQ存儲過程到SQL

EDIT 1)

考慮每個動態查詢不包括SELECT聲明。例如我最近寫了一個動態的PIVOT查詢。所以我不能用Dynamic LINQ

+0

親愛的@GertArnold請參閱我的編輯1。 – Arian

+0

Linq to Sql由它自己我不能根據特定的條件選擇特定的列 – Arian

回答

1

動態Linq?也許不是

我要建議Dynamic Linq但作爲你的「編輯」的狀態,不會爲你做。

在這種情況下,我想說的回答你的問題是「沒有最好的方式」。

Linq是最好的選擇嗎?

你的問題問了一個LINQ,特別是LINQ到SQL中,執行的如何實現動態查詢。

但考慮一下Linq to Sql的用途。那跳躍到LINQ的心態SQL的主要好處是:

  1. 強類型的查詢(在編譯時捕獲錯誤)
  2. 強類型的結果。這意味着很好的預寫類(在Linq to SQL的情況下,預生成)

現在,如果您在執行「Select」語句並始終返回實際映射表,那麼沒有理由不能使用動態的Linq庫。

但如果你返回任意非映射的結果,有一個在使用LINQ沒有意義的,實際上它不會讓你失望。

DataContext.ExecuteQuery<T>(string query) 

DataContext類確實有一個ExecuteQuery<T>方法,但是你不幸you cannot return specify dynamic as the T :-(

LINQ to SQL和存儲過程

最後,LINQ to SQL中可以映射到存儲過程。所以你可以有一個存儲過程把查詢當作參數,就像你的例子。但是,我相信它在結果類型方面與ExecuteQuery具有相同的侷限性,儘管我不這樣認爲。

我想看看,當你最後的選擇,並探討在LINQ的存儲過程的到SQL設計師回國是匿名的,動態的,或映射類型。

+0

感謝您的答案。實體框架是否適合他的目的?我們可以在Hibernate中編寫'HQL'這樣的ESQL嗎? – Arian

+0

嗨尼瑪,我不完全熟悉EF如此不確定。然而,我對NHibernate很熟悉,並且知道HQL不會允許你想要的。 HQL在本質上等同於Dynamic Linq,因爲它使您可以使用字符串來構建實際引用強類型對象的查詢。您的透視示例在這種情況下不起作用。 – andy