针对 DataTable 运行 SQL 查询

Posted

技术标签:

【中文标题】针对 DataTable 运行 SQL 查询【英文标题】:Run SQL Query Against DataTable 【发布时间】:2019-07-30 12:42:38 【问题描述】:

我正在填充这样的数据表

static DataTable GetTable()

    DataTable table = new DataTable();
    table.Columns.Add("name", typeof(string));
    table.Columns.Add("exam1date", typeof(date));
    table.Columns.Add("exam1complete", typeof(date));
    table.Columns.Add("exam2date", typeof(date));
    table.Columns.Add("exam2complete", typeof(date));
    table.Columns.Add("exam3date", typeof(date));
    table.Columns.Add("exam3complete", typeof(date));

    table.Rows.Add("joe", "2018-01-30", NULL, NULL, NULL, NULL, NULL);
    table.Rows.Add('james', '2018-02-14', '2018-02-21', '2018-03-02', NULL, NULL, NULL);
    table.Rows.Add('javier', '2018-01-01', '2018-01-14', '2018-03-01', '2018-03-12', '2018-04-01', NULL);
    return table;



static void Main()

    DataTable dtInfo = GetTable();

如何对 DataTable 运行此 SQL 语句以从数据表中以我可以使用的格式获取数据?

SELECT fname,  
    CASE 
    WHEN exam1complete IS NULL THEN 'exam1date'
    WHEN exam2complete IS NULL THEN 'exam2date '
    ELSE 'exam3date' END AS columnname,
    CASE
    WHEN exam1complete IS NULL then exam1date 
    WHEN exam2complete IS NULL then exam2date 
    ELSE exam3date END AS examdate
FROM dtInfo;

【问题讨论】:

使用 table.AsEnumerable() 枚举表。 可能值得检查 LINQ 而不是 SQL。尽管LINQ 在 C# 中,但它们实际上是相同的。它将允许您像SQL query 一样查询您的数据表。 Linq Query On A DataTable 您不能对数据表运行纯 SQL。您必须遍历执行逻辑的行,或者像 Symon 建议的那样使用 LINQ。 【参考方案1】:

它看起来有点奇怪,但如果你将 null 更改为 DateTime.MinValue 下面的代码似乎可以工作......

class Program

    static void Main(string[] args)
    
        DataTable dtInfo = GetTable();


        var query =
            from row in dtInfo.AsEnumerable() select new
            
              name =  row.Field<string>("name"),
              columnname = 
              (row.Field<DateTime>("exam1complete")==DateTime.MinValue) 
              ? 
              ("exam1date") 
              :
              (
                (row.Field<DateTime>("exam2complete") == DateTime.MinValue) ? ("exam2date") : ("exam3date")
              ),
              examdate =
              (row.Field<DateTime>("exam1complete") == DateTime.MinValue)
              ?
              (row.Field<DateTime>("exam1date"))
              :
              (
                (row.Field<DateTime>("exam2complete") == DateTime.MinValue) ? (row.Field<DateTime>("exam2date")) : (row.Field<DateTime>("exam3date"))
              )
            
            ;
    

    static DataTable GetTable()
    
        DataTable table = new DataTable();
        table.Columns.Add("name", typeof(string));
        table.Columns.Add("exam1date", typeof(DateTime));
        table.Columns.Add("exam1complete", typeof(DateTime));
        table.Columns.Add("exam2date", typeof(DateTime));
        table.Columns.Add("exam2complete", typeof(DateTime));
        table.Columns.Add("exam3date", typeof(DateTime));
        table.Columns.Add("exam3complete", typeof(DateTime));

        table.Rows.Add("joe", "2018-01-30", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue);
        table.Rows.Add("james", "2018-02-14", "2018-02-21", "2018-03-02", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue);
        table.Rows.Add("javier", "2018-01-01", "2018-01-14", "2018-03-01", "2018-03-12", "2018-04-01", DateTime.MinValue);
        return table;
    

【讨论】:

以上是关于针对 DataTable 运行 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

对 DataTable 执行 sql 查询

对数据表或实体列表的 SQL 查询

sql查询结果存入DataTable,然后从DataTable取数据

SQL 如何查询数据库中所有以DataTable开头的表名

Visual C#,来自现有DataTable的SQL查询?

将 SQL 语句转换为 DataTable 上的 LINQ 查询