2017-06-13 112 views
0

我是实体框架和Linq(Visual Studio 2017 - EF 5.0)的新手。目前,我可以毫无问题地阅读表格,但我不知道如何阅读链接表格。 我目前的功能是这样做的,但确实有一个简单的方法,而不是我开发的两步阅读。如何使用实体框架链接读取一对多链接表?

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; 
     } 
    } 

您可以看到我使用UserID从购物车表中获取购物车ID,然后使用Cart_Item表中的CartID检索购物车物品。 Cart_Item_Cart_ID是cart_item表中的外键。 (这是一对多表)

这就是我的想法,但显然不工作。

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;'for lambda扩展包含) –

+0

我在cart_item表中设置了外键。你能否完成上述查询,以便我能理解你在做什么?问题是我需要使用第一个表中的键来查询第二个表。 – PCG

+0

完整的查询应该是'var oCart = oMConnection.carts.Include(x => x.Items).Where(c => c.USER_ID == UserID);'是你的意思吗?您可以发布您的购物车类,这将表明您是否正确设置了导航属性。本文可能有所帮助:https://msdn.microsoft.com/en-us/library/jj713564%28v=vs.113%29.aspx?f=255&MSPPError=-2147217396 –

回答

0

因为你的查询有一对多的关系多层次,只是想和你的cart_items,它更容易走另外一条路是这样的:

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

按照你做的方式应该也可以,但是你需要使用SelectMany而不是像这样选择:

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

这太好了。非常感谢你。 – PCG