簡體   English   中英

將委托傳遞給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM