【问题标题】:How to select joined fields with grouped LINQ query如何使用分组 LINQ 查询选择连接字段
【发布时间】:2016-05-21 13:05:32
【问题描述】:

我已经搜索了该站点并以几种不同的方式对其进行了切片和切块,但我是 LINQ 的新手,我不知道如何从我的连接表中选择字段。每次运行时,我都会收到一条消息:

“UPC 列不属于表。”

“列条目不属于表。”

audits 表的每个文件名都有一行数据,scanDetail 表有多个与每个文件名关联的行。我需要加入表格,对数据进行分组,然后选择不同数量的 UPC,并且只显示最大条目数,因此每个文件名都有一行数据。

var query = from audit in audits.AsEnumerable()                
            join scan in scanDetail.AsEnumerable()
            on audit.Field<string>("filename") equals scan.Field<string>("filename")
            group audit by audit.Field<string>("filename") into g
            select new
            {
               Account = g.Select(x => x.Field<string>("Account")),
               Store = g.Select(x => x.Field<string>("Store")),
               AuditDate = g.Select(x => x.Field<string>("AuditDate")),
               UPCs = g.Select(x => x.Field<string>("UPC").Distinct().Count()),
               Qty = g.Select(x => x.Field<string>("ScanQty")),
               Retail = g.Select(x => x.Field<string>("RegTotal")),
               Entries = g.Select(x => x.Field<string>("Entry").Max()),
               Supervisor = g.Select(x => x.Field<string>("AuditSup")),
               Division = g.Select(x => x.Field<string>("StoreDivision")),
               Invoice = g.Select(x => x.Field<string>("InvAmount"))
           };

我这样试了,结果一样。

  var query = 
           from audit in audits.AsEnumerable()  
           
           join scan in scanDetail.AsEnumerable()
           on audit.Field<string>("filename") equals
            scan.Field<string>("filename")
           group audit by new {storeDisk = audit.Field<string>("filename"), 
                               Account = audit.Field<string>("Account"),
                               Store = audit.Field<string>("Store"),
                               AuditDate = audit.Field<string>("AuditDate"),
                               UPCs = (from UPC in scanDetail.AsEnumerable()
                                       select scan.Field<string>("UPC")),
                               Qty = audit.Field<string>("ScanQty"),
                               Retail = audit.Field<string>("RegTotal"),
                               Entries = (from Entry in scanDetail.AsEnumerable()
                                         select scan.Field<string>("Entry")),
                               Supervisor = audit.Field<string>("AuditSup"),
                               Division = audit.Field<string>("StoreDivision"),
                               Invoice = audit.Field<string>("InvAmount")
           } into g
           select new
           {

               Account = g.Key.Account,
               Store = g.Key.Store,
               AuditDate = g.Key.AuditDate,
               UPCs = g.Select(x => x.Field<string>("UPC").Distinct().Count()),
               Qty = g.Key.Qty,
               Retail = g.Key.Retail,
               Entries = g.Select(x => x.Field<string>("Entry").Max()),
               Supervisor = g.Key.Supervisor,
               Division = g.Key.Division,
               Invoice = g.Key.Invoice
        
           };

【问题讨论】:

  • 哪些字段属于scanDetail表? UPCEntry 确定,还有其他吗?
  • 只有这两个。

标签: c# linq


【解决方案1】:

由于“审计表中每个文件名都有一行数据”,因此无需对该表中的数据进行分组。在这种情况下,您可以使用group join,而不是常规连接,根据documentation

根据键相等关联两个序列的元素,并将结果分组。

换句话说,对于外部表格的每个元素,您都可以从内部表格中获得一组相关元素的集合。然后,您可以对该集合执行不同的聚合。请记住,该集合可以为空,并且在这种情况下某些聚合会抛出异常。

话虽如此,查询可能是这样的:

var query = from audit in audits.AsEnumerable()                
            join scan in scanDetail.AsEnumerable()
            on audit.Field<string>("filename") equals scan.Field<string>("filename")
            into scanGroup
            select new
            {
               Account = audit.Field<string>("Account"),
               Store = audit.Field<string>("Store"),
               AuditDate = audit.Field<string>("AuditDate"),
               UPCs = scanGroup.Select(scan => scan.Field<string>("UPC")).Distinct().Count(),
               Qty = audit.Field<string>("ScanQty"),
               Retail = audit.Field<string>("RegTotal"),
               Entries = scanGroup.Select(scan => scan.Field<string>("Entry")).OrderByDescending(x => x).FirstOrDefault(),
               Supervisor = audit.Field<string>("AuditSup"),
               Division = audit.Field<string>("StoreDivision"),
               Invoice = audit.Field<string>("InvAmount")
           };

【讨论】:

    【解决方案2】:

    您基本上需要从audit 中取出您想要的所有内容并将其放入组的“密钥”中。

    var query = from audit in audits.AsEnumerable()                
                join scan in scanDetail.AsEnumerable()
                on audit.filename equals scan.filename
                group audit by new { audit.Account, audit.Store, etc... } into g
                select new
                {
                   g.Key.Account,
                   g.Key.Store,
                   // etc for the rest of the audit fields
                   Entries = g.Max(x => x.Entry),
                   UPCs = g.Select(x => x.UPC).Distinct().Count()),
               };
    

    【讨论】:

    • 谢谢!我已经尝试过这样的事情,但它给了我同样的错误。知道我正在查询在运行时创建的数据表可能会有所帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多