2016-10-27 15 views
0

かなり基本的なSQLコードをLamdaまたはLinqに変えようとしていましたが、私はどこにもいません。ここにSQLクエリがあります:SQLをLambda/Linqに変換

SELECT * FROM Form a 
INNER JOIN FormItem b ON a.FormId = b.FormId 
INNER JOIN FormFee c ON a.FormId = c.FormId 
INNER JOIN FeeType d ON c.FeeTypeId = d.FeeTypeId 
WHERE b.StatusId = 7 

私はこれを試しましたが、私がしたいことはしません。

public Form GetFormWithNoTracking(int id) 
{ 
    return ObjectSet 
     .Where(x => x.FormId == id && 
        (x.FormItem.Any(di => di.StatusId == (short)Status.Paid))) 
     .AsNoTracking() 
     .FirstOrDefault(); 
} 

私は、そのStatusIdPaidあるFormItemからの行のみを返すようにしようとしています。しかし、上記はすべてを返します。 .Any()は一致するものがあるかどうかをチェックし、返品がある場合はこの場合、このフォームのデータにはStatusIdPaid、返品のないStatusIdのアイテムモール。

+0

linq lamdaを使用して内部結合を実行しようとしている場合、クイック検索で必要な結果が得られます。 http://stackoverflow.com/questions/2767709/c-sharp-joins-where-with-with- linq-and-lambda http://stackoverflow.com/questions/9720225/how-to-perform-join-between-multiple-tables-in-linq-lambda – dougajmcdonald

+0

この関数は、 ) 'Form'には' StatusId''Paid'を持つ 'FormItem'があります。あなたの戻り値の型は 'Form'なので、実際に何をしようとしているのか全く分かりません。私があなたの質問を正しく理解していれば、あなたは 'FormId'が' Paid'である 'FormId'' id'を持つ 'Form'の' FormItems'だけを望んでいます。 –

答えて

0

これは、あなたが求めているものを次のようになります。

  1. が返す、FormそのフォームのFormId = id
  2. でゲットあなたが必要な場合はStatusId = Paid
public IEnumerable<FormItem> GetFormWithNoTracking(int id) 
{ 
    return ObjectSet 
     .SingleOrDefault(x => x.FormId == id) 
     .Select(f => f.FormItem 
      .Where(di => di.StatusId == (short)Status.Paid)) 
     .AsNoTracking(); 
} 

を持っているすべてのFormItemsFormそのものでも、カスタムタイプを作成することができます(編集:@ Burkの回答を参照) Tuple<Form,IEnumerable<FormItem>>IEnumerable<Tuple<Form,FormItem>>など、必要に応じて最適なものを選択してください。

また、フォームの未払いのアイテムをすべて削除することもできます。

public Form GetFormWithNoTracking(int id) 
{ 
    var form = ObjectSet 
     .SingleOrDefault(x => x.FormId == id) 
     .AsNoTracking(); 

    var nonPaid = form.Select(f => f.FormItem 
      .Where(di => di.StatusId != (short)Status.Paid)).ToList(); 

    foreach(FormItem item in nonPaid) 
     form.FormItem.Remove(item); 

    return form; 
} 
+0

代わりの解決策は私のための治療を働いた。みんなありがとう! – clueless83

1
var query = (from a in ObjectSet.FormA 
      join b in ObjectSet.FormB on a.field equals b.field 
      where b.StatusId = 7 
      select new { a, b}) 

あなたは同じロジックで、残りを参加することができます。