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.