[英]LINQ-SQL - Using static readonly fields within CompiledQuery.Compile?
[英]Passing delegate to CompiledQuery.Compile method
在嘗試將委托System.Func<T,TResult>
傳遞給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查詢表達式。
請幫我解決這個問題。
CompiledQuery.Compile ()僅在Expression <Func <>>上定義,但不在Func <>上定義
如果重新編寫語句,您的代碼是否會編譯
var LINQHolder = GetPreCompiledQuery;
var CompiledLINQHolder = CompiledQuery.Compile(LINQHolder);
?
您無法傳遞委托,因為方法簽名指定了表達式樹,而不是委托 - 它就像那樣簡單。 它們是兩種截然不同的類型。
它們的共同點 - 以及最后一段代碼將編譯的原因 - 是編譯器可以將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");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.