将SQL代码转换为LINQ - Group By和Sum

时间:2016-09-07 15:25:15

标签: c# linq

无法将此代码转换为LINQ并预览到数据网格视图。

我看过this回答,但它没有帮助我

select tbl_user.id,tbl_user.name,tbl_user.family, sum(tbl_price.price) 
        from tbl_user,tbl_price
        where tbl_user.id=tbl_price.user_id_fk
        group by tbl_user.name+''+tbl_user.family,tbl_user.id,tbl_user.name,tbl_user.family

请帮我将此代码转换为linq

2 个答案:

答案 0 :(得分:0)

您基本上需要加入这两个表,将结果分组为UserId和 在User的每个项目的Price属性值上调用Sum方法。

像这样的东西

var usersWithTotalPrice = (from a in db.Users
                           join b in db.UserPrice on a.UserId equals b.UserId
                           select new { UserId = a.UserId, 
                                        FamilyName = a.Name + " " + a.FamilyName, 
                                        Price = b.Price}
                          ).GroupBy(f => f.UserId, items => items, (a, b) => new
                                     {
                                          UserId = a,
                                          FamilyName = b.FirstOrDefault().FamilyName ,
                                          Price = b.Sum(g=>g.Price)
                                     }
                          ).ToList();

usersWithTotalPrice变量将是一个项目的集合,每个项目都包含UserIdFamilyNamePrice属性。我使用了匿名投影。如果您有视图模型,则可以使用它。

public class UserWithPrice
{
  public int Id { set;get;}
  public string FamilyName { set;get;}
  public decimal Price { set;get;}
}

并在投影部分

中使用它
var usersWithTotalPrice = (from a in db.Users
                           join b in db.UserPrice on a.UserId equals b.UserId
                           select new { UserId = a.UserId, 
                                        FamilyName = a.Name + " " + a.FamilyName, 
                                        Price = b.Price}
                          ).GroupBy(f => f.UserId, items => items, (a, b) => 
                                   new UserWithPrice
                                   {
                                          Id = a,
                                          FamilyName = b.FirstOrDefault().FamilyName ,
                                          Price = b.Sum(g=>g.Price)
                                    }
                          ).ToList();

根据您的定义更新您的实体/ Dbset / Property名称。

答案 1 :(得分:0)

你甚至不需要使用linq。实际上,您可以使用datatable,并将gridview的数据源设置为该数据表。

dashboard_array