2015-11-08 5 views
-3

как скрытое в LINQ:как преобразовать SQL заявление LINQ в C#

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

помощь!

+0

Что ваша модель домена выглядеть для продукта, каталогизировать и Производитель ? –

ответ

1

Не пытайтесь перевести запрос буквально. В LINQ, вам не нужно присоединиться к организациям, если они уже есть отношения, потому что LINQ автоматически будет использовать отношения, чтобы присоединиться к организациям:

Так предполагается, что ваш Product имеет Catalog свойство, которое в свою очередь имеет Manufacturer свойство, вы можете написать LINQ без присоединяется так:

from p in Product 
where p.Active == 1 
select new { 
    Name = p.Name, 
    CatalogId = p.CatalogId, 
    ManufacturerId = p.ManufacturerId, 
    CatalogName = p.Catalog.Name, 
    ManufacturerName = p.Manufacturer.Name }; 
+0

a Товар имеет свойство ManufacturerId. Это не означает, что Продукт имеет свойство Производитель, и я не уверен, что у объекта изготовления обязательно есть Имя. Я согласен, что было бы разумно создавать такие свойства, но вы не обязаны. –

-1

кусок торта ^^

Просто вызовите метод ToString() для IQueryable возвратит SQL Представление.

var query = 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; 
string sqlQuery = query.ToString(); //SQL Query Saved Here 
+0

Они хотят наоборот. – Joey

+0

нет, я имею в виду, что db.tbl_products.Where(). Select() ... но не знаю – Jackie

0

Решение построить результат Темп после первого соединения и использовать его в качестве первой последовательности во втором присоединиться

var result = product.Where(p => p.Active == 1), // 1st sequence 
    .join(catalog,   // 2nd sequence 
     p => p.CatalogId, // selector from 1st sequence 
     c => c.Id,   // selector from 2nd sequence 
     (p, c) =>   // take the elements where the selector match 
      new {ManufacturerId = p.ManufacturerId, 
       Name = p.Name, 
       CatalogId = p.CatalogId, 
       CatalogName = c.Name}) // result is 1st sequence next join 
    .Join(Manufacturer,     // 2nd sequence 2nd join 
     r => r.ManufacturerId,   // selector result 1st join 
     m => m.Id,      // selector 2nd sequence 2nd join 
     (r, m) =>       // two elements where the selectors match 
      new {Name = r.Name,   // build the result object 
       CatalogId = r.CatalogId, 
       ManufacturerId = r.ManufacturerId, 
       CatalogName = r.CatalogName, 
       ManumfacturerName = r.Name}); 
Смежные вопросы