2012-08-27 144 views
1

下面的代碼產生錯誤:LINQ到實體無法識別自定義的方法

LINQ to Entities does not recognize the method System.String GenerateSubscriptionButton(Int32) method, and this method cannot be translated into a store expression.

如何創建LINQ到實體正確的自定義的方法呢​​?

var model = _serviceRepository.GetProducts().Select(p => new ProductModel 
{ 
    Id = p.Id, 
    Name = p.Name, 
    Credits = p.Credits, 
    Months = p.Months, 
    Price = p.Price, 
    PayPalButton = GenerateSubscriptionButton(p.Id) 
});   

private string GenerateSubscriptionButton(int id) 
{ 
    return new PaymentProcessor.PayPalProcessor().CreateSubscriptionButton(id); 
} 

回答

5

你不能那樣做。提供者應該如何將你的方法轉換爲SQL?

記住:LINQ to Entities實際上並不執行您的查詢的C#代碼。相反,它解釋表達式並將它們轉換爲SQL。

在你conrete情況下,解決方案可能會是這個樣子:

var model = _serviceRepository.GetProducts() 
           .Select(p => new ProductModel 
              { 
               Id = p.Id, 
               Name = p.Name, 
               Credits = p.Credits, 
               Months = p.Months, 
               Price = p.Price 
              }) 
           .ToList() 
           .Select(x => 
             { 
              x.PayPalButton = GenerateSubscriptionButton(x.Id); 
              return x; 
             }); 

ToList呼叫到目前爲止對數據庫執行查詢並返回結果。從這一點來看,查詢實際上是一個LINQ對象查詢,其中代碼不被解釋但執行。

+0

非常感謝你..這個答案讓我的一天:) .. – NMathur

1

你不能。問題是,你不能從SQL調用GenerateSubscriptionButton

您需要檢索實體,然後一旦它們在內存中,您可以撥打GenerateSubscriptionButton。在將實體投影到模型之前,您可以通過添加對AsEnumerable的調用來實現此目的。

var model = _serviceRepository.GetProducts() 
    .AsEnumerable() 
    .Select(p => new ProductModel 
        { 
         Id = p.Id, 
         Name = p.Name, 
         Credits = p.Credits, 
         Months = p.Months, 
         Price = p.Price, 
         PayPalButton = GenerateSubscriptionButton(p.Id) 
        }); 
相關問題