2016-07-09 8 views
0

私はASP .NETとLINQにとって非常に新しいので、私の無知について私を許してください。linq/ef:結果を返すために複数のテーブルを接続するクエリを作成する方法は?

私は、リージョンクラスをしました:

public class Region 
    { 
     [Key] 
     public int Region_ID { get; set; } 
     public string Region_Name { get; set; } 

    } 

とサービスクラス:

public class Service 
    { 
     [Key] 
     public int Service_ID { get; set; } 
     public string Service_Name { get; set; } 
    } 

そしてregion_IDsとservice_IDsの多くの多マッピングを格納したマッピングクラス:

public class Mapping_ServiceToRegion 
    { 
     [Key] 
     public int Service_ID { get; set; } 
     public int Region_ID { get; set; } 
    } 

ここでは、指定されたService_IDに基づいてRegion_Nameを出力するAPI関数を作成します。これは私が私のRegionsControllerで、これまで持っているものです。

// GET api/Regions/Service_ID 
    [ResponseType(typeof(Region))] 
    public async Task<IHttpActionResult> GetRegion(int id) 
    { 

     var region_id = from sr in db.Mapping_ServiceToRegions 
          where sr.Service_ID == id 
          select sr.Region_ID; 

     var region = await db.Regions.Select(r => 
      new Region() 
      { 
       Region_ID = r.Region_ID, 
       Region_Name = r.Region_Name 
      }).SingleOrDefaultAsync(r => r.Region_ID == region_id); //ERROR 

     if (region == null) 
     { 
      return NotFound(); 
     } 

     return Ok(region); 
    } 

私は取得していますエラーがある:それはデリゲート型でないため

は、ラムダ式を変換できません。

私は私ののregion_id変数がのservice_idに基づいて、複数のregion_idsを持っていることを実感。これを説明するコードを変更するにはどうすればよいですか? r.Region_ID IN region_idと言うのに使用できるIN演算子はありますか?

また、上記のコードは正しく表示されますか?

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

+0

のようなカスタムのviewmodel/DTOオブジェクトを使用するかする必要があります。現在の編集内容に元の質問が反映されていないため、編集した回答を除外すると投稿された回答が無効になることがあります。それをやめないでください – Rahul

+0

申し訳ありません - 複数の編集セクションを作成するのではなく、あなたや他の人が何が起こっているのかを簡単に確認できると思いました。私は元に戻します。多くの謝罪。 – 90abyss

+0

それは大丈夫です...いいえ、あなたの投稿を編集することはOKですが、新しい編集を追加して元の投稿を上書きしないでください。 – Rahul

答えて

1

あなたregion_idIEnumerable<T>ではなく、単一の値であるので、あなたが直接等価比較を実行することはできませんので、あなたは以下のようなContains()方法を使用してSingleOrDefaultAsync()呼び出しを変更する必要があります。

SingleOrDefaultAsync(r => region_id.Contains(r.Region_ID)) 

ああ!!!ここでRegionはEFマップされたエンティティの1つであり、あなたはそれを構築しようとしているため、エラーが発生しています。あなたはAnonymousタイプを選択することにした(または)あなたが実際に同じポストに2つの質問を...あなたはそのようなあなたのポストを編集しないでください

var region = await db.Regions.Select(r => 
     new 
     { 
      Region_ID = r.Region_ID, 
      Region_Name = r.Region_Name 
     }).SingleOrDefaultAsync(r => region_id.Contains(r.Region_ID)); 
+0

これで正常にビルドされましたが、例外が発生しています: エンティティまたは複合型'x.Models.Region'は、LINQ to Entitiesクエリでは構築できません。 上記のコードは正しく構成されていますか? – 90abyss

+0

@ 90abyss、あなたの投稿されたコードから 'x.Models.Region'を見ることができません。さらに、それは別々に掲示されるべき別個の質問のように見える。 – Rahul

+0

は上記のRegionクラスを参照しています。私がデバッグすると、 "var region = await ......"という行が例外を与える場所です。 – 90abyss

関連する問題