方法

2016-11-15 5 views
1

をLINQ to SQLのを使用してグループから値を選択するために、誰もが、私がやっていること方法

select 
COUNT(ot.UserId) as orderCount, SUM(ot.TotalAmount) as TotalAmount, 
MAX(u.UserName) as UserName, MAX(c.name) as ClientName 
from OrderTemplate ot 
join User u 
on u.userid = ot.UserId 
join Client c 
on u.ClientID = c.clientid 
group by ot.UserId 

私はC#でLINQと同等のSQLを記述するためにされて助けることができる、

from ot in dbContext.OrderTemplates 
join user in dbContext.Users on ot.UserId equals user.UserID 
join client in dbContext.Clients on user.ClientID equals client.ClientID 
group ot by ot.UserId into g 
select new 
{ 
    //UserName = need to pick this from user table 
    //ClientName = need to pick this from client table 
    OrderCount = g.Count(), 
    TotalAmount = g.Sum(x=> x.TotalAmount) 
}; 

私は」することができますtは、SQLに応じて値を選択します。複数のキーによってそのよう

+1

'UserName'の値は何ですか? 'Max(u.Username)'は実際にはどういう意味ですか?それらは同じユーザー名ですか?いくつかの値は 'null'で、次に' max'を使ってその値を取得しますか? –

+0

はい、ユーザー名はグループごとに同じになるので、いずれかを選択するだけです。 –

+0

また、あなたのSQLでは、 'UserId'によって補足されていますが、linqでは' OrderId' –

答えて

2

ユーザ名とクライアント名が同じである(とactaully各注文は、1つのクライアントと1人のユーザーを持っている)場合は、より良いグループ:

from ot in dbContext.OrderTemplates 
join u in dbContext.Users on ot.UserId equals u.UserID 
join c in dbContext.Clients on u.ClientID equals c.ClientID 
group ot by new { ot.UserId, u.UserName, c.ClientName } into g 
select new 
{ 
    UserName = g.Key.UserName, 
    ClientName = g.Key.ClientName, 
    OrderCount = g.Count(), 
    TotalAmount = g.Sum(x=> x.TotalAmount) 
}; 

そうではありません、またはしたい場合は、正確に好きならあなたのSQLは、匿名オブジェクトをインスタンス化するときに複数のプロパティを持つキーの代わりにSQLを返します。

Username = g.Max(item => item.UserName) // will just use string comparison to select the "max"