【问题标题】:Dynamic LINQ query against DataTable针对 DataTable 的动态 LINQ 查询
【发布时间】:2017-11-29 17:40:20
【问题描述】:

我想在 DataTable 中汇总 SQL 表中的数据,以便在 DataGridView 中显示。我想使用 LINQ 查询表。

此 SQL 查询生成摘要:

;WITH CTE AS (
SELECT * FROM vw_Trades WHERE NOT (dtExpDate < GETDATE())
)
SELECT szSymbol, dtFwdDate, sum(fQuantity) 
FROM CTE GROUP BY szSymbol, dtFwdDate 
HAVING SUM(fQuantity) <> 0
ORDER BY szSymbol, dtFwdDate
GO

我尝试使用 System.Linq.Dynamic 包,但它似乎已过时。尝试了 System.Linq.Dynamic.Core 包,但找不到任何文档。问题是我在编译时不知道 SELECT 语句中将包含哪些字段,这使得无法使用类型化的 LINQ 查询。

我可以使用动态 SQL,但想使用 LINQ。有没有一个像样的库,还是我最好坚持使用 SQL?

【问题讨论】:

  • 我在您的查询中没有看到任何“动态”的内容 - 您认为哪一部分是“动态的”?
  • 如果你需要使用DataTables,你最好坚持使用ADO.NET和SQL。
  • 抱歉,澄清一下,根据用户输入,szSymbol、dtFwdDate 和 SUM(fQuantity) 列可能会有所不同。所以他们可能只需要 szSymbol 和 SUM(fQuantity) 或不同的字段。

标签: c# sql linq dynamic


【解决方案1】:

我不明白为什么需要 CTE;您可以将 SQL 表达为

SELECT szSymbol, dtFwdDate, sum(fQuantity) 
FROM vw_Trades 
WHERE NOT (dtExpDate < GETDATE())
GROUP BY szSymbol, dtFwdDate 
HAVING SUM(fQuantity) <> 0
ORDER BY szSymbol, dtFwdDate

Linq 等价物类似于:

from t in vw_Trades
where dtExpDate >= DateTime.Now
group by new { szSymbol, dtFwdDate } into g
select new {szSymbol, dtFwdDate, quantity = g.Sum(i => i.fQuantity) }
where quantity <> 0

请注意,您可以直接从查询中获取 DataGridView - 无需使用 DataTable(实际上它会使其更复杂)。

【讨论】:

  • 对不起,我应该澄清一下。交易表中有 22 个字段。这里的查询选择了三个。用户可能会从 3 到 22 个字段中进行选择。你说得对,我不需要 CTE,因为其他原因。
  • 好的,所以要动态选择返回的列?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
相关资源
最近更新 更多