2017-01-04 10 views
0

こんばんは全員にLINQクエリの結果を変換します。は、カスタムモデルのリスト

私は、SQLクエリの結果にLINQを持っている、と私はここ

ダウンカスタムモデルクラスのリストにクラスモデルこの結果を変換したい:

public class Beneficiary 
    { 
     public int BeneficiaryId { get; set; } 

     [Required] 
     public string FirstName { get; set; } 
     [Required] 
     public string LastName { get; set; } 

     public DateTime? CreatedAt { get; set; } 

     [Column(TypeName = "date")] 
     public DateTime? BithDate { get; set; } 

     public int? CommunityId { get; set; } 
     public virtual Community Community { get; set; } 

     [Required] 
     public string Gender { get; set; } 


     public string IdNumber { get; set; } 

     [Required] 
     [StringLength(50)] 
     public string AppName { get; set; } 

     [StringLength(50)] 
     public string BeneficiaryNumber { get; set; } 

     public int CompanyId { get; set; } 
     public virtual Company Company { get; set; } 

     public virtual ICollection<BeneficiaryProject> BeneficiaryProjects { get; set; } 

     public virtual ICollection<Card> Cards { get; set; } 

     public virtual ICollection<Invoice> Invoices { get; set; } 
    } 

、ここでクエリがあること上記のクエリが正常に実行される

var list = (from B in db.Beneficiaries 
           join ben in db.BeneficiaryProjects on B.BeneficiaryId equals ben.BeneficiaryId 
           where (ben.CardNeeded == true && ben.ProjectId == temp.ProjectId) 
           select new Beneficiary() 
           { 
            BeneficiaryId = B.BeneficiaryId, 
            FirstName = B.FirstName, 
            LastName = B.LastName, 
            IdNumber = B.IdNumber, 
            Gender = B.Gender 
           }); 

が、私は以下のようBeneficiaryのリストにvar listを変換する場合:私が使用

  List<Beneficiary> list1 = list.ToList<Beneficiary>(); 

が、私は以下の例外だ:EFから結果を取得した後、カスタムクラスに

An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code 

Additional information: The entity or complex type 'E_Voucher.Models.Beneficiary' cannot be constructed in a LINQ to Entities query. 
+0

あなたはこれを試しましたか: 'List BeneficiaryList =(あなたのクエリはここにあります).ToList();' –

+2

'ToList'を呼び出すまでクエリ自体は実行されないので、正常に実行されるかもしれません。実際にはそうではありません。 –

+0

クエリを見て、temp.ProjectIDに問題がある可能性があります。あなたは参加していませんか? – DaniDev

答えて

1

あなたは、この行でこのエラー を(取得している理由:)

List<Beneficiary> list1 = list.ToList<Beneficiary>(); 

は、あなたがリストへのLINQクエリの変数を変換しようとしているということです。

あなたが本当にやらなければならないことは、次のとおりです。

List<Beneficiary> list1 = list.ToList(); 

あなたはtemp.ProjectIDのために持っているクエリ:

var projects = db.Projects.Where(p => p.ContractId == id); foreach (var temp in projects) 

のようなものでなければなりません:

int ProjectId = (from P in db.Projects where P.ContractId == id select P.ProjectId).FirstOrDefault(); 

とその値を取って次のクエリに入れます:

... where (ben.CardNeeded == true && ben.ProjectId == ProjectId) 
+0

元のクエリを見て、temp.ProjectIDに問題がある可能性があります。あなたは参加していませんか? – DaniDev

+0

あなたは私が参加を逃したという意味ですか? –

+0

temp.ProjectIdとは何ですか、またはどこから来ていますか?一時テーブルですか? – DaniDev

2

メイク変換:

var list = (
    from B in db.Beneficiaries 
    join ben in db.BeneficiaryProjects on B.BeneficiaryId equals ben.BeneficiaryId 
    where (ben.CardNeeded == true && ben.ProjectId == temp.ProjectId) 
    select new { 
     B.BeneficiaryId, 
     B.FirstName, 
     B.LastName, 
     B.IdNumber, 
     B.Gender 
    } 
).AsEnumerable() 
.Select(B => new Beneficiary() { 
    BeneficiaryId = B.BeneficiaryId, 
    FirstName = B.FirstName, 
    LastName = B.LastName, 
    IdNumber = B.IdNumber, 
    Gender = B.Gender 
}).ToList(); 

注:あなたがエラーを取得する理由を実行中のToListは、EFクエリが遅れての実行であることです。クエリが正しくない可能性がありますが、その結果を得ることが唯一の方法です。

+0

ありがとうございます、私はあなたのクエリを試みましたが、次の例外があります。 'EntityFramework.SqlServer.dllで' System.Data.Entity.Core.EntityCommandExecutionException 'タイプの例外が発生しましたが、ユーザコードで処理されませんでした。 追加情報:コマンド定義の実行中にエラーが発生しました。詳細については内部例外を参照してください。 –

+0

@ MGCR7これは非常に奇妙です。私は答えを編集しました、更新されたものを試してもらえますか? – dasblinkenlight

+0

これはおそらく列挙しようとしているからです(AsEnumerable())。 元のクエリで私の提案する解決策を試してください。 – DaniDev

0

LINQ to Entities内のタイプの受益者オブジェクトをマッピングされたエンティティオブジェクトに投影することはできません。

はこれを試してみてください:

db.Beneficiaries.Join(db.BeneficiaryProjects, B => B.BeneficiaryId, ben => ben.BeneficiaryId, (B, ben) => new { B, ben }) 
       .Where(x => x.ben.CardNeeded == true && x.ben.ProjectId == temp.ProjectId) 
       .Select(x => x.B) 
       .ToList(); 

それはあなたのLINQクエリと同じことを行う必要がありますが、あなたの受益モデルオブジェクトを選択し、それをマップするラムダ式です。 ToList()は、必要に応じてAsQueryable()またはAsEnumerable()に置き換えることができます。

+0

ありがとう、私はあなたの提案を試みたが、私は、次の例外 'System.Data.Entity.Core.EntityCommandExecutionException'の例外がEntityFramework.SqlServer.dllで発生したが、ユーザーコード ' –

+0

@ MGCR7例外を打つときは、内部の例外をチェックしてください。これにより、正確な問題の詳細がわかります。 – RizJa

関連する問題