【问题标题】:How to write LINQ in C# with joins based on SQL Query?如何使用基于 SQL Query 的连接在 C# 中编写 LINQ?
【发布时间】:2021-08-15 18:35:34
【问题描述】:

我需要根据以下查询编写一个 linq。

在 SQL Server 中,

select EXID,ID,NAME 
from Table1 A
join Table2 B on A.BXID = B.BID
left outer join Table3 C ON C.AXID = A.ID
AND C.EXID = (some number/NULL)

这给了我 300 条记录

在 LINQ 中,

try
        {
            using (var context = new cltransformationContext())
            {
                var Details = (
                            from A in context.Table1
                            join B in context.Table2 on A.BXID equals B.BID
                            join C in context.Table3 on A.ID equals C.AXID  
                select new Table1()
                           {
                            ID = A.ID,
                            name = A.NAME + '-' B.Name
                            }).ToList();
                return Details;
            }
        }

我在这里获得了 5000 条记录。

我错过了 left outer joinC.EXID = (some number/NULL) 条件。 如何在查询中做到这一点?

我应该只得到 300 条记录。

【问题讨论】:

  • 您缺少 AND。
  • 在 c# 中无法做到这一点。我们如何添加这个条件?
  • 在 context.Table3.Where(x => x.EXID == 123) 中加入 C

标签: c# linq linq-to-sql


【解决方案1】:

此查询将创建 LEFT JOIN:

var query =
    from A in context.Table1
    join B in context.Table2 on A.BXID equals B.BID
    from C in context.Table3.Where(C => A.ID == C.AXID && C.EXID == ...).DefaultIfEmpty()
    select new Table1
    {
        ID = A.ID,
        name = A.NAME + '-' B.Name
    };

【讨论】:

  • 很少出现错误 - 表达式术语“选择”无效,预期上下文关键字“on”,预期上下文关键字“等于”
  • 我已将join 替换为from。可能你错过了。
【解决方案2】:

应该这样做

var query =
    from A in context.Table1
    join B in context.Table2 on A.BXID equals B.BID
    join table3 in context.Table3.Where(X => x.EXID = 123) on A.ID == table3.AXID into table3Joined
    from C in table3Joined.DefaultIfEmpty() // this is how we do the left join
    select new Table1
    {
        ID = A.ID,
        name = A.NAME + '-' B.Name
    };

复杂性在于我们必须将连接放入table3Joined,然后我们才能做到from C in table3Joined.DefaultIfEmpty()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多