使用连接表进行内部联接以检索linq中的所有CategoryProducts

时间:2015-06-04 13:42:20

标签: c# linq entity-framework entity-framework-6

我有一个名为CategoryProducts的连接表,包含2个字段(CategoryId,ProductId)。我试图弄清楚将所有产品对象放在一个类别中的正确方法。

这就是我所拥有的:

// get list of all of the products in a category
public static IEnumerable<Product> GetList(int categoryId)
{
    using (var context = new AppContext())
    {
        var pList= (from p in context.Products
                       join cp in context.CategoryProducts on categoryId equals cp.CategoryId
                       select p).ToList();

        return pList;
    }
}

2 个答案:

答案 0 :(得分:3)

试试这个:

  var pList= (from p in context.Products
              join cp in context.CategoryProducts on p.Id equals cp.ProductId
              where cp.CategoryId==categoryId
              select p).ToList();

您需要使用在每个源中共享的某些值进行连接,并且可以进行相等性比较。通常在Linq to Entities中基于表之间的逻辑关系。例如,在您的情况下,我认为您在ProductsCategoryProducts之间存在一对多关系。正确的加入方式是使用Product的PK和CategoryProduct上的关系的FK。

此外,如果CategoryProduct实体具有以下结构:

public class CategoryProduct
{
   public int ProductId{get;set;}

   public int CategoryId{get;set;}

   public virtual Category Category{get;set;}

   public virtual Product Product{get;set;}
}

你可以这样做:

var query= context.CategoryProducts.Where(cp=>cp.CategoryId==categoryId).Select(cp=>cp.Product);

答案 1 :(得分:0)

如果您有这些实体之间的关系,那么您只需选择Categories并加入Products

var result = context.CategoryProducts.
             Where(c=>c.CategoryId == categoryId ).Include(c => c.Products).ToList();