Объединение таблиц в Linq с помощью лямбда-выражения

#c# #asp.net #sql #linq #lambda

#c# #asp.net #sql #linq #лямбда

Вопрос:

Я работаю с Entity Framework. Я должен применить объединение двух таблиц, но чего я хочу, если есть одна таблица, Category со столбцом categoryid в качестве внешнего ключа, который имеет целочисленный тип данных, и другая таблица, Products со столбцом id в качестве первичного ключа, который также имеет целочисленный тип данных.

Теперь мне нужно выбрать только те записи из Products таблицы, которые имеют id то, что содержится в Category таблице.

Это мой код:

 string categoryid= "10,11,12";

datalist.DataSource = (from p in objCategory
                             join q in objProducts on p.categoryid.contains(q.id)
                             select new
                             {
                                 p.FilePath,
                                 p.ItemName,
                                 p.Description,
                                 q.image_url,
                                 q.name,
                                 q.price
                             }).ToList();
  

Ответ №1:

Вы могли бы сделать что-то вроде этого:

 List<int> categoryIds = new List<int>(){ 10, 11, 12 };

datalist.DataSource = (from c in objCategory
                       join p in objProducts 
                       on c.categoryid equals p.categoryid
                       where categoryIds.Contains(c.categoryid)
                       select new
                       {
                           c.FilePath,
                           c.ItemName,
                           c.Description,
                           p.image_url,
                           p.name,
                           p.price
                       }).ToList();
  

Ответ №2:

Вместо того, чтобы извлекать все данные в память и затем объединять, лучше создать свойства навигации и извлекать данные по этим свойствам. В этом сценарии все объединение будет работать внутри базы данных, и вы получите только отфильтрованные данные из базы данных. Решение будет работать следующим образом

 class Category
{
  public int CategoryId { get; set; }
  public string Description{ get; set; }
  public string FilePath {get;set;}
  public string ItemName {get;set;}

  public virtual ICollection<Product> Product{ get; set; } 
}

class Product
{
   public int ProductId { get; set; }
   public string name{ get; set; }
   public int CategoryId { get; set; }
   public string Product.image_url {get;set;}
   public int price {get;set;}

   public virtual Category Category{ get; set; }
}
  

Теперь вам просто нужно вызвать следующий запрос

 datalist.DataSource = (from p in objCategory.Include("Product")                            
                         select new
                         {
                             p.FilePath,
                             p.ItemName,
                             p.Description,
                             p.Product.image_url,
                             p.Product.name,
                             p.Product.price
                         }).ToList();