Linq. Выбрать из нескольких таблиц

В проекте у меня есть следующие таблицы:

  1. Продукт (id, catalogId, manufacturerId...)
  2. Каталог
  3. производитель

Также модель Product (id, name, catalogId, catalogTitle, manufacturerId, manufacturerName).

Как можно записать в Linq этот SQL-запрос ниже, если я хочу получить элемент продукта?

SELECT Product.Name, Product.CatalogId, Product.ManufacturerId, [Catalog].Name, Manufacturer.Name
FROM Product, [Catalog], Manufacturer
WHERE [Catalog].Id=Product.CatalogId AND Manufacturer.id=Product.ManufacturerId AND Product.Active=1

Ответ 1

Во-первых, я отвечу на ваш вопрос... затем ответьте на свой ответ на комментарии. Чтобы ответить на ваш вопрос, в Linq вы сделаете следующее:

from p in Product
join c in Catalog on c.Id equals p.CatalogId
join m in Manufacturer on m.Id equals p.ManufacturerId
where p.Active == 1
select new { Name = p.Name, CatalogId = p.CatalogId, ManufacturerId = p.ManufacturerId, CatalogName = c.Name, ManufacturerName = m.Name };

Это даст вам анонимный объект с запрошенными вами товарами. Если вам нужно использовать это в другом месте (и вы не используете динамические объекты), я бы предложил создать модель представления и создать экземпляр одного из них в вашем выборе.

Пример:

public class ProductInfoView 
{
     public string Name { get; set; }
     public int CatalogId { get; set; }
     public int ManufacturerId { get; set; }
     public string CatalogName { get; set; }
     public string ManufacturerName { get; set; }
}


from p in Product
join c in Catalog on c.Id equals p.CatalogId
join m in Manufacturer on m.Id equals p.ManufacturerId
where p.Active == 1
select new ProductInfoView() { Name = p.Name, CatalogId = p.CatalogId, ManufacturerId = p.ManufacturerId, CatalogName = c.Name, ManufacturerName = m.Name };

Это сделает ссылки на результаты вашего запроса немного менее болезненными.

Чтобы ответить на ваш комментарий, вы делаете много объединений, если все, что вам нужно, это продукт. Ваши критерии гарантируют только три вещи

  1. Активный флаг продукта - 1
  2. У вашего продукта есть существующая запись в каталоге
  3. В вашем продукте имеется запись производителя

Если # 2 и # 3 являются излишними, и вам необязательно нужны имена, вы можете просто сделать:

from p in Product
where p.Active == 1
select p

Если продукт является моделью CRUD, вы можете потенциально глубоко загрузить его, чтобы включить информацию о производителе/​​каталоге, или использовать вышеупомянутую модель представления.

Удачи!

Ответ 2

Объединение результатов из нескольких таблиц без явного объединения:

from p in Product
from c in Catalog
from m in Manufacturer
where c.Id == p.CatalogId && m.Id == p.ManufacturerId && p.Active == 1
select new 
    { 
        p.Name,
        p.CatalogId,
        p.ManufacturerId,
        c.Name,
        m.Name 
    };