2013-08-07 8 views
10

nopCommerce 3.0でlinq joinクエリを作成しようとしました。私はlinqの2つのテーブルに参加し、ステートメント本文のラムダ式をnopCommerceの式ツリーに変換できません

コードを正常に書き込みます。しかし、視覚的なスタジオintellicenceは

文の本体でラムダ式のようなエラーが

var roles = _customerEventRoleRepository.Table.Where(c => c.EventId == selevent) 
        .Join 
        (
         _customerRepository.Table, 
         cev => cev.CustomerId, c => c.Id, 
         (cev, c) => 
         {        
          var cust = new CustomerEventRolesModel(); 

          cust.Id = cev.Id; 
          cust.CustomerId = c.Id; 
          cust.Customer = c.Email; 
          cust.ContactName = c.GetAttribute<string>(SystemCustomerAttributeNames.FirstName); 
          cust.CompanyName = c.GetAttribute<string>(SystemCustomerAttributeNames.Company); 
          cust.Speaker = cev.IsSpeaker; 
          cust.Sponsor = cev.IsSponser; 

          return cust; 
         } 
        ).OrderBy(cev => cev.Customer).ToList(); 

以下の私のコードを参照してください。式ツリーに変換することはできません表示されますが、エラーが

を示し

enter image description here

助けてください

+4

ラムダは関数です。この関数はSQLに変換できません。あなたは、あなたがやっていることをする別の方法を見つける必要があります。 –

+0

貴重なご回答ありがとうございます。 ここでは、問い合わせ結果にContactNameとCompanyNameが必要です。 –

答えて

2

エラーメッセージはと正確にはです。あなたはラムダ式を持っています。ステートメント本体を持っています。ステートメント本体のラムダ式は、式ツリーに変換することはできません。しかし、Joinには、EFで使用する式ツリーが必要です。あなたが持っているものを次のようなボディを持たないラムダ式に置き換えてみるべきです:

(cev, c) => new CustomerEventRolesModel { 
       Id = cev.Id, 
       CustomerId = c.Id 
      } 

などです。ところで

ContactName = c.GetAttribute<string>(SystemCustomerAttributeNames.FirstName) 

はEFでは動作しません。期間。あなたは他の何かを理解することをお勧めします。

+0

貴重なご回答ありがとうございます。本当に申し訳ありません。私は経験豊富な人ではありません。このクエリ結果にContactNameとCompanyNameを含めるにはどうすればよいですか。 ContactNameとCompanyNameフィールドを追加するためには、関数全体を変更する必要があると思います。 –

+4

それらを入力することによって、最初の2つのプロパティに対して行ったことを真似します。 – jason

+3

-1;ひどく短い文章でエラーメッセージの内容を繰り返し、ALL CAPSを追加すると、彼のコードがなぜ違法であったのか理解者を理解するのに役立つことはありません。特に、この答えは、式ツリーが何であるか、EFがそれらを使用するか、またはコンパイルエラーがなくなるような小さな並べ替えをコンパイラが実行できない(または実行しない)理由を説明していませんラムダボディをメソッドに抽出し、そのメソッドへの呼び出しをボディレスラムダ式の値として使用する)。 –