【问题标题】:Linq DataTable Having QueryLinq DataTable 有查询
【发布时间】:2012-09-10 18:27:25
【问题描述】:

我正在使用 Microsoft.ACE.OLEDB 驱动程序来查询 excel 文件。然后将结果传递给 DataTable。但是,此驱动程序不支持我想使用的 T-SQL 查询。

with abc as
(
SELECT Credit, Debit,[Reference 2] As [Job Code]
from xlSheet
WHERE ([Reference 2] LIKE '%JOB%') OR ([Reference 2] LIKE '%CRN%')
union all
SELECT Credit, Debit,[Reference] As [Job Code]
from xlSheet
WHERE ([Reference] LIKE '%JOB%') OR ([Reference] LIKE '%CRN%')
)
SELECT sum(Credit) as  Credit, sum(debit) as Debit,ABS(ROUND(SUM(Debit - Credit),2)) as Total , [Job Code],
            case when ROUND(SUM(Debit - Credit),2) < 0
                then 'JOB'
                else 'JOBR'
            end as 'Trans Code' 
from abc
group by [Job Code]
HAVING ROUND(SUM(debit - credit),2)  <> 0

所以,我把它分成了两个查询,即:

SELECT Credit, Debit,[Reference 2] As [Job Code]
    from xlSheet
    WHERE ([Reference 2] LIKE '%JOB%') OR ([Reference 2] LIKE '%CRN%')
    union all
    SELECT Credit, Debit,[Reference] As [Job Code]
    from xlSheet
    WHERE ([Reference] LIKE '%JOB%') OR ([Reference] LIKE '%CRN%')

第二个是:

SELECT sum(Credit) as  Credit, sum(debit) as Debit,ABS(ROUND(SUM(Debit - Credit),2)) as Total , [Job Code], 
            case when ROUND(SUM(Debit - Credit),2) < 0 
                then 'JOB' 
                else 'JOBR' 
            end as 'Trans Code'  
from abc 
group by [Job Code] 
HAVING ROUND(SUM(debit - credit),2)  <> 0 

现在我知道可以对 DataTable 执行基本的选择查询,但没有比这更复杂的了。我听说过 LINQ,我相信这可以通过这个来完成。 但是由于不熟悉 LINQ,我在这方面需要一些帮助。 如果做不到这一点,我看到的唯一其他方法是将结果写回辅助 excel 文件,并使用辅助查询重新读取该文件——但这会带来巨大的性能缺陷。

【问题讨论】:

  • 第一个查询是不受支持的吗?如果是这样,两部分查询的第二部分在哪里?如果不是,那是否返回可接受的DataTableDataTable 看起来像什么?你想做什么?
  • 第二部分,不支持的是:SELECT sum(Credit) as Credit, sum(debit) as Debit,ABS(ROUND(SUM(Debit - Credit),2)) as Total , [ Job Code],当 ROUND(SUM(Debit - Credit),2) 0
  • 你能把它添加到你的问题中吗?在 cmets 中无法读取。
  • 与论坛网站不同,我们不使用“谢谢”、“任何帮助表示赞赏”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.

标签: c# linq datatable


【解决方案1】:

我们有免费的 LINQ in Action 章节介绍 LINQ 和额外的第 14 章讨论 LINQ to DataSets(您将用于 DataTables),如果您需要一些东西来开始。你可以在http://www.manning.com/marguerie/阅读它们。

【讨论】:

    【解决方案2】:

    所以我通过使用 Linq to DataTable 解决了我的查询,如下所示:

            var result = from b in dsXLData.Tables[0].AsEnumerable()
                         group b by b.Field<string>("cJobCode")  into grp
                         where grp.Sum(e => Math.Round(e.Field<Double>("debit"),2) - Math.Round(e.Field<Double>("credit"),2)) != 0
                         select new
                         {
                             cJobCode = grp.Key,
                             Credit = Math.Round(grp.Sum(x => x.Field<Double>("credit")), 2),
                             Debit = Math.Round(grp.Sum(x => x.Field<Double>("debit")), 2),
                             Amount_Incl = Math.Round(Math.Abs(grp.Sum(x => x.Field<Double>("debit")) - grp.Sum(x => x.Field<Double>("credit"))), 2),
                             Trans_Code =
                                    (
                                        Math.Round(grp.Sum(x => x.Field<Double>("debit")) - grp.Sum(x => x.Field<Double>("credit")), 2) < 0 ? "JOB" : "JOBR"
                                    )
    
                         };
    

    【讨论】:

      猜你喜欢
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多