2016-11-16 3 views
0

LINQラムダ式のヘルプを探しています。 2つの結合テーブルからデータを選択する必要があります。このようなSQLクエリ:私の状況ではLINQラムダ式のヘルプを探す

declare @formName 

select T1.Title, T1.Text, T2.Name, T1.Active, T1.ConfirmationText, T1.URL 
From T1 join T2 on T2.FormCodeID = T1.FormCodeID 
Where T1.Active =1 and T2.Name = @formName 

は、私は、LINQラムダ式を使用する必要がありますが、コードでエラーが発生しました:

public IEnumerable<UModel.Form> GetForms(string formName) 
    { 
     IEnumerable<UModel.Form> form = null; 

     using (var context = new UASContext()) 
     { 
      form = context.Forms.Join(context.FormCode, f => f.FormCodeID, fc => fc.FormCodeID, 
       (f, fc) => new { Active = f.Active, FormName = fc.FormName}) 
       .Where(f => (f.Active == true)) 
       .Where (fc => (fc.FormName ==formName)).ToList(); 
     } 

     return form; 
} 

すべてのヘルプや提案を高く評価されます。

+2

。エラーを投稿してください。あなたがそれについて理解していないことを説明してください。あなたが修正しようとしたものを投稿してください。 – nvoigt

答えて

0

あなたのLINQは大丈夫に見えます。しかし、あなたはそれがFormオブジェクトのリストになると期待しているようです。あなたのSQLステートメントはではありません。はT1のレコードセットを返しますが、LINQはどちらも行いません。

あなたのコードはよく見えます、あなたの期待は間違っています。それを修正する方法はありません。あなたのSELECTは、LINQがフォームを返さないT1行を返しません。

あなたが参加するときのフォームを覚えておく必要がありますことを実行する場合:

form = context.Forms.Join(context.FormCode, f => f.FormCodeID, fc => fc.FormCodeID, 
      (f, fc) => new { Form = f, Active = f.Active, FormName = fc.FormName}) 
      .Where(temp => (temp.Active && temp.FormName == formName)) 
      .Select(temp => temp.Form).ToList(); 

しかし、それはないあなたのSQLのと同じです。

+0

ありがとうございました。ありがとう。 – SCD

1

あなたは

form = context.Forms.Join(context.FormCode, f => f.FormCodeID, fc => fc.FormCodeID, 
        (f, fc) => new { Form = f, FormCode= fc}) 
        .Where(f => f.Form.Active == true && f.FormCode.FormName==formName) 
        .Select(x=>x.Form) 
        .ToList(); 
+0

この修正は正確には何ですか? – nvoigt

+0

@ Eldeniz、これはwhere節からf.FormCode.FormName == formNameを削除した後に動作します。私はテーブルを変更したので、ここでformNameを渡す必要はありません。どうもありがとうございました! – SCD

+0

歓迎です – Eldeniz

0

更新

form = context.Forms.Join(context.FormCode, f => f.FormCodeID, fc => fc.FormCodeID, 
       (f, fc) => new { Active = f.Active, FormName = fc.FormName}) 
       .Where(f => f.Active == true && f.FormName==formName).ToList(); 

を試すことができます私は、LINQクエリをお勧めしますいくつかのケースでは、より明らかだ:

public IEnumerable<UModel.Form> GetForms(string formName) 
{ 
    using (var context = new UASContext()) 
    { 
     var query = from form in context.Forms 
      join formCode in context.FormCode on form.FormCodeID equals formCode.FormCodeID 
      where form.Active == true and formCode.FormName == formName 
      select form; 

     return query.ToList(); 
    } 
} 
0

私はと思う問題は、IEnumerable<UModel.Form>を返し、new { Active = f.Active, FormName = fc.FormName}つまり匿名オブジェクトを選択していることです。あなたはFormエンティティのコレクションを選択して返します。

あなたは以下のようにフォームを選択するためにあなたのクエリを変更することができます:私たちはあなたのコンパイラがすでにやった仕事をするつもりはありません

form = context.Forms.Join(context.FormCode, f => f.FormCodeID, fc => fc.FormCodeID, (f, fc) => new { Form = f, FormName = fc.FormName }).Where(x => (x.Form.Active && x.FormName == formName)).Select(x => x.Form); 
+0

ありがとう。このコードも役に立ちます。 – SCD