2011-02-26 125 views
0

雖然試圖通過委託System.Func<T,TResult>CompiledQuery.Compile方法,我收到以下錯誤傳遞委託CompiledQuery.Compile方法

錯誤1個類型參數的方法「System.Data.Linq.CompiledQuery.Compile( System.Linq.Expressions.Expression>)'不能從使用中推斷出來,請嘗試明確指定類型參數。「

public static void CompiledLINQQuery() 
{ 
    Northwind_LINQtoSQLDataContext objData = new Northwind_LINQtoSQLDataContext(); 
    Func<Northwind_LINQtoSQLDataContext, IQueryable<Customer>> LINQHolder = GetPreCompiledQuery; 

    LINQHolder = CompiledQuery.Compile(LINQHolder); //This is where the error comes up   
    var Results = LINQHolder.Invoke(objData); 
} 

private static IQueryable<Customer> GetPreCompiledQuery(Northwind_LINQtoSQLDataContext objD) 
{ 
    return from cust in objD.Customers where cust.Country == "Germany" select cust; 
} 

在同一時間,如果我直接通過LINQ到CompiledQuery.Compile方法,那麼它的工作沒有任何錯誤。

LINQHolder = CompiledQuery.Compile((Northwind_LINQtoSQLDataContext objD) => from cust in objD.Customers where cust.Country == "Germany" select cust); 

我不明白爲什麼我不能通過委託,而不是LINQ查詢表達式。

請幫我解決這個問題。

回答

1

CompiledQuery.Compile()僅在表達< Func鍵< >>定義,但不是Func鍵<>

請問您的代碼編譯,如果你重新寫的語句

var LINQHolder = GetPreCompiledQuery; 
var CompiledLINQHolder = CompiledQuery.Compile(LINQHolder); 

+0

這不會在第一行從別的編譯,開 - 一個隱式類型的局部變量的初始化表達式不能是方法組。 – 2011-02-26 20:33:12

1

您無法傳遞委託,因爲方法簽名指定了表達式樹,而不是委託 - 這很簡單。它們是兩種截然不同的類型。

他們的共同點是什麼 - 你的代碼的最後一塊將編譯的原因 - 是編譯器可以在lambda表達式轉換成無論是委託或表達式目錄樹。現在,這不是您在第一種情況下創建委託的方式 - 您實際上正在使用方法組轉換。這絕不會創建表達式樹。

如果你想在一個單獨的方法來指定查詢,它必須是這樣的:

private static Expression<Func<Northwind_LINQtoSQLDataContext, 
           IQueryable<Customer>> 
    GetPreCompiledQuery() 
{ 
    return db => from cust in db.Customers 
       where cust.Country == "Germany" 
       select cust; 
} 

順便說一句,這是值得意識到,對於簡單的查詢,查詢表達式往往比較比使用擴展方法麻煩。例如,在上述等效於:

private static Expression<Func<Northwind_LINQtoSQLDataContext, 
           IQueryable<Customer>> 
    GetPreCompiledQuery() 
{ 
    return db => db.Customers.Where(cust => cust.Country == "Germany"); 
} 
+0

感謝您的回覆。我將以下內容提供給了LINQHolder定義以及GetPrecompiled方法的返回類型。 '**「表達式 >> LINQHolder = GetPrecompiledQuery;」**'但現在我得到像 錯誤「**無法將方法組'GetPrecompiledQuery'轉換爲非委託類型'System.Linq。 Expressions.Expression >>'。您是否打算調用該方法?**「 – AbrahamJP 2011-02-27 10:54:07