【问题标题】:C# LINQ INNER JOIN is returning wrong countC# LINQ INNER JOIN 返回错误的计数
【发布时间】:2021-06-22 08:07:07
【问题描述】:

我有以下带有 JOIN 的 sql,但它返回的记录数为 50,但是当我将其转换为 LINQ 时,我没有得到匹配的计数。我注意到当我添加 ON 子句时,visual studio intellisense 下拉菜单不显示第二个表的 ID 属性。我想知道这是否是一个问题。

这是简单的 SQL

SELECT * FROM Table1 T1 JOIN Table2 T2 ON T1.MyId = T2.MyId WHERE T1.IsCompleted

这是我的 Lamba LINQ,其中包含 VC Intellisense 无法正常工作的评论。对于 table2,intellisense 下拉列表,它只显示 Equals、GetHashCode、GetType 和 ToString。只需手动输入 MyId 即可成功构建所有内容,但计数太高。谢谢

var test = this.myDbContent.Table1
           .Join (this.myDbContent.Table2
             table1 => table1.MyId,
             table2 => table2.MyId, 
             (table1, table2) => new { table1, table2}
           )
           .Where (joinedTable => joinedTable.Table1.IsCompleted == 1)

【问题讨论】:

  • 您的应用程序很可能不需要JOIN。您是否考虑过使用相关实体,例如var testx = this.myDbContent.Table1.Select(t => new Tuple<int,int>(t.MyId, t.Table2.MyId));
  • 我意识到这不是对您问题的直接回答,但是带有实体框架的 LINQ 作为 SQL 的直接逐语句替代品并不总是很好。如果您使用实体模型,您可能会得到更好、更容易的结果。
  • ORM 被证明是一个令人头疼的问题,也是浪费时间的来源,因为这些事情可以通过 SQL 轻松高效地实现。
  • @Tarik,试试linq2db
  • @SvyatoslavDanyliv 快速浏览了一下。只要事情简单(对于其他 ORM),一切都很好。如此简单的库在哪里进行连接? AFAIK 实体框架能够处理这个问题并构建一个包含连接的 SQL 语句。处理复杂的查询是另一回事。我的结论是带有 DataTables 的 ADO.Net 提供了一个更好的框架。

标签: c# sql linq


【解决方案1】:

Join 是简单的 LINQ 操作,但通过 LINQ Query 可以更好地理解。

var query = 
    from t1 in myDbContent.Table1
    join t2 in myDbContent.table2 on t1.MyId equals t2.MyId
    where t1.IsCompleted
    select new 
    {
        t1,
        t2
    };

如果仍然有不同的结果,可能MyId 是可空字段,EF 也匹配空值。

可以通过选项配置禁用:

builder.UseSqlServer(ceConnection, x => x.UseRelationalNulls(true));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多