Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq Group By-在每个组中选择一条记录并输入结果_Linq_Linq To Sql - Fatal编程技术网

Linq Group By-在每个组中选择一条记录并输入结果

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

下面的查询与我试图实现的查询相似,但简化了。 在我的实际代码中,我有四个表联接,并试图得到一个包含最新版本的结果。我有一个非常接近的C#版本,但无法创建带有类型结果集的Vb版本

C#版本 此查询生成我想要的适当sql,但无法选择我需要的列

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更新了问题