简体   繁体   中英

What is the Max function equivalent of SQL in LINQ?

I have this SQL query that I need to convert to 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:

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? I'm still new to learning 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).

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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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