简体   繁体   English

LINQ中SQL的Max函数等效项是什么?

[英]What is the Max function equivalent of SQL in LINQ?

I have this SQL query that I need to convert to LINQ: 我有此SQL查询,我需要将其转换为LINQ:

SELECT * 
FROM USER U
INNER JOIN (
    SELECT USERID , MAX(SALESDATE) AS MAXDATE
    FROM SALES
    GROUP BY USERID) S ON U.ID = S.USERID

So far, this is what I've come up with LINQ: 到目前为止,这是我提出的LINQ:

var Users = (from d in db.Users
             join s in db.Sales on d.Id equals s.UserId
             select new Models.User
             {
                Id = d.Id,
                UserName = d.UserName,
                FirstName = d.FirstName,
                LastName = d.LastName,
                EmailAddress = d.EmailAddress,
                PhoneNumber = d.PhoneNumber,
                LastPurchase = s.SalesDate
             }).Max(x => x.SalesDate);

However, I'm pretty sure the result is not the same. 但是,我很确定结果是不一样的。 Can anyone suggest the correct way of converting this to LINQ? 谁能建议将其转换为LINQ的正确方法? I'm still new to learning LINQ. 我还是学习LINQ的新手。 I really appreciate the help. 我非常感谢您的帮助。

try this 尝试这个

var Users = (from d in db.Users
             from s in db.Sales.where(x=>x.Userid==d.id).groupby(x=>x.Userid)
             select new Models.User
             {
                Id = d.Id,
                UserName = d.UserName,
                FirstName = d.FirstName,
                LastName = d.LastName,
                EmailAddress = d.EmailAddress,
                PhoneNumber = d.PhoneNumber,
                LastPurchase = s.Max(x=>x.SalesDate)
             }).ToList();

Your current Linq query, joins first on the whole tables and then select contrary to your SQL's one which first selected in the Sales table and then joined on that result (the alias S in your example). 您当前的Linq查询首先在整个表上联接,然后选择与SQL相反的查询,该SQL首先在Sales表中选择然后在该结果上联接(在示例中为别名S )。

var query = from u in db.Users
            join s in (from sale in db.Sales
                       group sale by sale.Id into grp
                       select new {
                           Id = grp.Key,
                           LastPurchase = grp.Max(item => item.SalesDate)
                       })
            on u.Id equals s.Id
            select /* what you need to retrieve */;

You can do it like this: 您可以这样做:

        var query1 = from sale in db.Sales
                     group sale by sale.UserId into g
                     let maxDate = g.Max(s => s.SalesDate)
                     select new { UserId = g.Key, maxDate };

        var query2 = from user in db.Users
                     from q1 in query1.Where(q => q.UserId == user.Id)
                     select new { user.Id, user.UserName, user.Firstname, user.lastname, ... , q1.maxDate };

        var result = query2.ToList();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM