2015-11-08 74 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将自动使用的关系加盟实体:

所以假设你的ProductCatalog属性又具有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

件^^

只需拨打的IQueryable的ToString()方法将返回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});