【问题标题】:C# LINQ DataTable "WHERE NOT IN"C# LINQ 数据表“不在”
【发布时间】:2020-12-26 23:22:52
【问题描述】:

我有两个数据表。我可以使用 LINQ 连接这两个表,但我正在尝试将以下 SQL 查询写入 LINQ,但失败了。

连接两个DataTables做了什么:

dtMerged = (from a in dtOraDataTable.AsEnumerable()
                join b in dtSqlSmsTable.AsEnumerable()
                    on a["EntrySerialNo"].ToString() equals b["EntrySerialNo"].ToString()
                    into g
                where g.Any()
                select a).CopyToDataTable();

现在我想做:

SELECT * FROM OraSmsData a WHERE EntrySerialNo NOT IN (SELECT EntrySerialNo FROM SqlSmsData WHERE IsProcessed=1);

如何在 LINQ 中实现这一点?如果有人在这里指导我,我将不胜感激。

【问题讨论】:

    标签: c# linq datatable


    【解决方案1】:

    这对你有用吗?

    var query =    
        from a in dtOraDataTable.AsEnumerable() 
        where !(from b in dtSqlSmsTable.AsEnumerable()   
                select b["EntrySerialNo"].ToString())    
               .Contains(a["EntrySerialNo"].ToString()    
        select a;
    

    【讨论】:

    • 运算符“!”不能应用于显示此错误的“EnumerableRowCollection”类型的操作数。
    • 我认为只有一个括号是错误的。 Contains 检查应该在 where !(...) 之外...如所示 here
    • 好地方,我现在修好了。
    • 带有解释的代码通常比带有“试试这个”或类似的代码转储更好......
    • "EntrySerialNo" 是 sql server 数字数据类型。我收到转换错误。
    【解决方案2】:

    您可以执行以下操作:

    var query = 
      dtOraDataTable.AsEnumerable()
        .Where(x => !dtSqlSmsTable.AsEnumerable()
        .Select(y => y.Field<decimal>("EntrySerialNo")).Contains(x.Field<decimal>("EntrySerialNo")));
    

    【讨论】:

    • "EntrySerialNo" 是 sql server 数字数据类型。我收到转换错误。
    • int 解决了您的问题吗?如果仍然出现该错误,您可以使用 decimaldouble
    • 这对我有用。谢谢@Sowmyadhar。 var dtMerged = dtOraDataTable.AsEnumerable() .Where(x => !dtSqlSmsTable.AsEnumerable() .Select(y => y.Field("EntrySerialNo")).Contains(x.Field("EntrySerialNo "))).CopyToDataTable();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多