2015-09-03 7 views
0
select c.Name, d.First_Name, COUNT(c.Name) as qty 
from order_product_s a 
    inner join Order_s b on a.Order_Id = b.Id 
    inner join Product_s c on a.Product_Id = c.Id 
    inner join Customer_s d on b.Customer_Id = d.Id 
where b.Customer_Id = 4869 
group by c.Name, d.First_Name 
+0

Извините, но SE не является услугой написания кода. (Мы здесь, чтобы помочь вам написать код, а не писать код для вас.) – jarlh

+0

Добро пожаловать в Stack Overflow! Пожалуйста, никогда не удаляйте SQL и не запрашивайте конверсию. По крайней мере, покажите модель класса, поэтому видны свойства навигации и множество ассоциаций. Кроме того, скажите, какой тип LINQ вы нацеливаете (на сущности?), * И * показываете свои собственные первые усилия. Они разъясняют нам больше, чем вы думаете. –

ответ

2

Что-то вроде этого:

int __UserId = 4869; 

var results = 
( 
    from t in 
    (
     from a in Repo.order_product_s 
     from b in Repo.Order_s 
      .Where(bb=> bb.id == a.Order_Id) 
     from c in Repo.Product_s 
      .Where(cc => cc.Id == a.Product_Id) 
     from d in Repo.Customer_s 
      .Where(dd => dd.Id == b.Customer_Id) 

     where b.Customer_Id == __UserId 

     select new 
     { 
      Name = c.Name 
      ,First_Name = d.First_Name 
     } 

    ) 
    group t by new { t.Name , t.First_Name } into g 
    select new 
    { 
     Name = g.Key.Name 
     ,First_Name=g.Key.First_Name 
     ,qty = g.Count(x => x.Name != null) 
    } 

).ToList(); 

или более компактны:

var results = 
( 
    from a in Repo.order_product_s 
    from b in Repo.Order_s 
     .Where(bb=> bb.id == a.Order_Id) 
     // .DefaultIfEmpty() // <== makes join left join   
    from c in Repo.Product_s 
     .Where(cc => cc.Id == a.Product_Id) 
     // .DefaultIfEmpty() // <== makes join left join   
    from d in Repo.Customer_s 
     .Where(dd => dd.Id == b.Customer_Id) 
     // .DefaultIfEmpty() // <== makes join left join   

    where b.Customer_Id == __UserId 

    select new 
    { 
     Name = c.Name 
     ,First_Name = d.First_Name 
    } 
    into t group t by new { t.Name , t.First_Name } into g 
    select new 
    { 
     Name = g.Key.Name 
     ,First_Name=g.Key.First_Name 
     ,qty = g.Count(x => x.Name != null) 
     // Or like this 
     // ,qty = g.Select(x => x.Name).Where(x => x != null).Count() 
     // and if you ever need count(distinct fieldname) 
     //,qty = g.Select(x => x.GroupName).Where(x => x != null).Distinct().Count() 
    } 

) 
// .OrderBy(t => t.Name).ThenBy(t => t.First_Name).ThenBy(t => t.qty) // Order in SQL 
.ToList() 
// .OrderBy(t => t.Name).ThenBy(t => t.First_Name).ThenBy(t => t.qty) // Order in .NET 
; 
Смежные вопросы