如何使用与实体框架的链接读取一对多链接表?

时间:2017-06-13 14:39:26

标签: linq frameworks entity

我是Entity Framework和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从Carts表中获取购物车ID,然后我使用CartID检索购物车Cart_Item表中的商品。 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; }
}

1 个答案:

答案 0 :(得分: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);