2017-06-13 10 views
0

私はEntity FrameworkとLinq(Visual Studio 2017 - EF 5.0)を初めて使用しています。現在、問題なくテーブルを読むことができましたが、どうすればリンクテーブルを読むことができますか? 私の現在の機能はそれを行いますが、私が開発した2段階の読み方よりも簡単な方法があることは確かです。Entity Frameworkとのリンクを使用して、1対多数のリンクテーブルを読み取るにはどうすればよいですか?

public override List<CartItem> GetMyCartOrderItems(int UserID) 
    { 
     try 
     { 
      using (foodorderingdbEntities oMConnection = new foodorderingdbEntities()) 
      { 

       var oCart = oMConnection.carts.SingleOrDefault(p => p.USER_ID == UserID); 
       if (oCartItems != null) 
       { 
        int CartID = oCart.CART_ID; 
        var oCartItems = oMConnection.cart_item.Where(p => p.CART_ITEM_CART_ID == CartID); 
        if (oCartItems != null) 
        { 
         List<CartItem> oRecList = new List<CartItem>(); 
         foreach (cart_item oDBrec in oCartItems) 
         { 
          CartItem oRec = new CartItem(); 
          oRec.CartID = oDBrec.CART_ITEM_ID; 
          oRec.CartItemID = oDBrec.CART_ITEM_CART_ID; 
          oRec.DateTime = oDBrec.CART_ITEM_ADDED_DATE_TIME; 
          oRec.SystemComments = oDBrec.CART_ITEM_SYSTEM_COMMENTS; 
          oRecList.Add(oRec); 
         } 
         return oRecList; 
        } 
       else { return null; } 
       } 
       else { return null; } 
      } 
     } 
     catch (Exception ex) 
     { 
      //IBLogger.Write(LOG_OPTION.ERROR, "File : MHCMySQLDataConection.cs, Method : GetPatientByID(1), Exception Occured :" + ex.Message + Environment.NewLine + "Trace :" + ex.StackTrace); 
      return null; 
     } 
    } 

あなたは、私がユーザーIDを使用して、カート、テーブルからカートIDを取得し、その後、私はCartIDがCart_Itemテーブルからカートのアイテムを取得し使用することを見ることができました。 Cart_Item_Cart_IDは、cart_itemテーブルの外部キーです。 (これは1対多の表です)

これは私が考えているものですが、明らかに機能しません。

List<cart_item> oCartItems = oMConnection.carts.SingleOrDefault(c => c.USER_ID == UserID).cart_item.Where(p => p.CART_ITEM_CART_ID = c.CART_ID).ToList<cart_item>();

任意のヘルプ?

私のエンティティの関係enter image description here

public partial class cart 
{ 
    public cart() 
    { 
     this.cart_item = new HashSet<cart_item>(); 
    } 

    public int CART_ID { get; set; } 
    public int USER_ID { get; set; } 
    public decimal ORDER_TOTAL_COST { get; set; } 

    public virtual ICollection<cart_item> cart_item { get; set; } 
    public virtual user user { get; set; } 
} 
+0

カートにアイテムのナビゲーションプロパティがありますか?もしそうなら、 'var oCart = db.carts.Include(x => x.Items).Where(...);'( 'System.Data.Entity;を使用していることを確認してください。 lambda extension Include) –

+0

cart_itemテーブルに外部キー設定があります。あなたは何をしようとしているのか理解できるように上記の質問を完了してください。問題は、最初のテーブルのキーを使用して2番目のテーブルをクエリする必要があることです。 – PCG

+0

完全なクエリーは 'var oCart = oMConnection.carts.Include(x => x.Items).Where(c => c.USER_ID == UserID);です。 Cartクラスを投稿できますか?ナビゲーションプロパティが正しく設定されているかどうかを示します。この記事は、次のような場合に役立ちます。https://msdn.microsoft.com/en-us/library/jj713564%28v=vs.113%29.aspx?f=255&MSPPError=-2147217396 –

答えて

0

クエリは、多くの関係1つの複数のレベルがあり、あなただけのcart_itemsをしたい、それがこのような他の道を行くことが容易だからです。

var oCart = oMConnection.cart_item 
    .Where(c=>c.cart.user.USER_ID == UserID); 

あなたのやり方はうまくいくはずでしたが、Selectの代わりにSelectManyを使う必要がありました:

var oCartItems = oMConnection.carts 
    .Where(c=>c.USER_ID==UserID) 
    .SelectMany(c=>c.cart_item); 
+0

これは素晴らしいことです。どうもありがとうございました。 – PCG

関連する問題