Linq Group By-在每个组中选择一条记录并输入结果
下面的查询与我试图实现的查询相似,但简化了。 在我的实际代码中,我有四个表联接,并试图得到一个包含最新版本的结果。我有一个非常接近的C#版本,但无法创建带有类型结果集的Vb版本 C#版本 此查询生成我想要的适当sql,但无法选择我需要的列Linq Group By-在每个组中选择一条记录并输入结果,linq,linq-to-sql,Linq,Linq To Sql,下面的查询与我试图实现的查询相似,但简化了。 在我的实际代码中,我有四个表联接,并试图得到一个包含最新版本的结果。我有一个非常接近的C#版本,但无法创建带有类型结果集的Vb版本 C#版本 此查询生成我想要的适当sql,但无法选择我需要的列 var query= from user in Customers join adrs in CustomerAddress on user.Id equals adrs.CustId group user
var query= from user in Customers join adrs in CustomerAddress
on user.Id equals adrs.CustId
group user by adrs.CustId into g
select g.OrderByDescending(x=>x.adrs.Version).First();
VB版本
此查询按顺序失败,调用第一个查询会在后面生成糟糕的sql
dim query= from user in Customers Join adrs in CustomerAddress _
on user.Id Equals adrs.CustId _
Group By custId=adrs.CustId Into g = Group _
Order By adrs.version Descending _
Let latestAddress=g.First() _
Select new ResultObject() with _
{ _
.AddressId=latestAddress.adrs.Id, _
.Street=latestAddress.adrs.Street _
}
dim results=query.ToList()
--更新
我正在寻找与此类似的SQL,它是由上面的C#查询生成的,只是我想选择列名
SELECT [t3].[test], [t3].[ID], [t3].[RequestQueueId], [t3].[CI_RequestType], [t3].[CI_Division], [t3].[CI_Company],
FROM (
SELECT [t0].[RequestQueueId]
FROM [RequestHeader] AS [t0]
GROUP BY [t0].[RequestQueueId]
) AS [t1]
OUTER APPLY (
SELECT TOP (1) 1 AS [test], [t2].[ID], [t2].[RequestQueueId], [t2].[CI_RequestType], [t2].[CI_Division], [t2].[CI_Company],
FROM [RequestHeader] AS [t2]
WHERE [t1].[RequestQueueId] = [t2].[RequestQueueId]
ORDER BY [t2].[Version] DESC
) AS [t3]
ORDER BY [t3].[Version] DESC
对于初学者来说,如果您非常喜欢sql,可以将VB版本与c版本完全相同,因为c版本返回的对象上会有您想要的列。我对查询语法不是很在行,但我认为它类似于:
Dim query = From user In Customers Join adrs In CustomerAddress _
On user.Id Equals adrs.CustId _
Group user By adrs.CustId Into g _
Select g.OrderByDescending(Function(x) x.adrs.Version).First()
但是,一种可能的流畅版本可能是:
Dim query = From user In Customers Join adrs In CustomerAddress _
On user.Id Equals adrs.CustId _
Group user By adrs.CustId Into g _
Select g.OrderByDescending(Function(x) x.adrs.Version).First()
C#
VB
Dim query = Customers _
.Join( _
CustomerAddress, _
Function(x) x.Id, _
Function(x) x.CustId, _
Function(o,i) i _
).GroupBy(Function(x) x.CustId) _
.SelectMany(Function(x) x _
.OrderByDescending(Function(y) y.version) _
.First() _
).Select(Function(x) New ResultObject() With { _
.AddressId = x.Id, _
.Street = x.Street _
})
注意:上面的代码未经测试,但我希望它能有所帮助 我想这会解决你的问题
var query =
from customeraddress in db.CustomerAddresses
join customers in db.Customers on new { CustId = customeraddress.CustId } equals new { CustId = customers.Id }
join LatestVersion in
(
(from customeraddress_1 in db.CustomerAddresses
group customeraddress_1 by new
{
customeraddress_1.CustId
} into g
select new
{
CustId = (System.Int32)g.Key.CustId,
MaxVersion = (System.Int32)g.Max(p => p.Version)
}))
on new { customeraddress.CustId, customeraddress.Version }
equals new { CustId = Convert.ToInt32(LatestVersion.CustId), Version = Convert.ToInt32(LatestVersion.MaxVersion) }
select new
{
Id = (System.Int32)customers.Id,
customers.Field1,
customers.Field2,
customeraddress.Field3,
customeraddress.Field4,
Version = (System.Int32)customeraddress.Version
};
var results = query.ToList();
你能发布你想要的等效TSQL吗achieve@Raymund,我已使用所需的sql更新了问题