2016-05-20 56 views
1

我已经搜索了网站,并切片和切丁这几种不同的方式,但我是新来的LINQ,我无法弄清楚如何从我的连接表中选择字段。每次运行时,我都会收到一条消息:如何选择与分组的LINQ查询连接的字段

“列UPC不属于表”。

“列条目不属于表”。

审计表对每个文件名都有一行数据,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 

      }; 
+0

哪些字段属于'scanDetail'表? 'UPC'和'Entry'肯定,还有其他? –

+0

那些是唯一的两个。 –

回答

0

由于“的审计表具有用于每个文件名中的一行数据”,没有必要组从该表中的数据。在这种情况下,而不是常规的加入,你可以有根据documentation使用group join,:

进行关联两个序列的基础上平等的关键要素,并对结果进行分组。

换言之,对于外部表的每个元素你得到一个设置从内表相关元件的。然后您可以在该组上执行不同的聚合。请记住,在这种情况下,该集合可以是空的,并且一些聚合体会引发异常。

有了这样说,查询可能是这样的:

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") 
      }; 
+0

这工作完美,谢谢! –

0

你基本上需要从要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()), 
      }; 
+0

谢谢!我尝试过这样的事情,但它给了我同样的错误。它可能有助于知道我正在查询在运行时创建的数据表? –