1

下面的代码会产生错误:

LINQ to Entities 无法识别方法System.String GenerateSubscriptionButton(Int32)method,并且此方法无法转换为存储表达式。

如何在 LINQ to Entities 中创建正确的自定义方法?

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);
}
4

2 回答 2

6

你不能那样做。提供者应如何将您的方法转换为 SQL?

请记住:LINQ to Entities 实际上并不执行查询的 C# 代码。相反,它解释表达式并将它们转换为 SQL。

在您的具体情况下,解决方案可能看起来像这样:

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 to objects 查询,其中代码不被解释而是被执行。

于 2012-08-27T12:56:56.523 回答
1

你不能。问题是,您不能GenerateSubscriptionButton从 SQL 调用。

您需要检索实体,然后一旦它们在内存中,您就可以调用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)
                     });
于 2012-08-27T12:57:17.303 回答