1

以下のコードではエラーが発生します。

LINQ to Entities はメソッド method を認識せずSystem.String GenerateSubscriptionButton(Int32)、このメソッドをストア式に変換できません。

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 から呼び出すことができないことです。

エンティティを取得する必要があり、エンティティがメモリに格納されたら、 を呼び出すことができますGenerateSubscriptionButtonAsEnumerableエンティティをモデルに投影する前にへの呼び出しを追加することで、これを実現できます。

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 に答える