【问题标题】:ANDing in JOIN Condition Using LINQ使用 LINQ 在 JOIN 条件下进行 ANDing
【发布时间】:2014-05-03 18:39:06
【问题描述】:

我最近遇到了一些看起来像这样的 SQL 代码

SELECT
    a.Id,
    b.Id,
    c.Id,
    d.Id,
    b.Name,
    d.Occupation,
FROM TableA a
JOIN TableB b ON a.Id = b.Id
JOIN TableC c ON b.Id = c.Id AND b.Name = a.Name
JOIN tableD d ON c.Id = d.Id AND c.Occupation = d.Occupation

我从来没有在相应的 LINQ 查询中像这样在 JOIN 中使用 AND(对于上下文,我对所有查询都使用实体框架和 LINQ)。我通常把所有的 AND 都放在 where 子句中,如下所示:

var query = from a in dbContext.TableA
            join b in dbContext.TableB on a.Id equals b.Id
            join c in dbContext.TableC on b.Id equals c.Id
            join d in dbContext.TableD on c.Id equals d.Id
            where b.Name = a.Name
            where c.Occupation = d.Occupation
            select new
            {
                AId = a.Id,
                BId = b.Id,
                CId = c.Id,
                DId = d.Id,
                BName = b.Name,
                DOccupation = d.Occupation,
            };

我可以使用什么技术来让我的 LINQ 查询匹配上面的 SQL 语句?

【问题讨论】:

    标签: c# sql linq entity-framework tsql


    【解决方案1】:

    您可以通过从您的属性构造匿名类型来加入多个属性,如下所示:

    var query = from a in dbContext.TableA
                join b in dbContext.TableB on new { a.Id, a.Name } equals new { b.Id, b.Name }
                join c in dbContext.TableC on b.Id equals c.Id
                join d in dbContext.TableD on new { c.Id, c.Occupation } equals new { d.Id, d.Occupation }
                select new
                {
                    AId = a.Id,
                    BId = b.Id,
                    CId = c.Id,
                    DId = d.Id,
                    BName = b.Name,
                    DOccupation = d.Occupation,
                };
    

    请注意,匿名类型中每个属性的名称、顺序和数据类型需要在equals 的两侧都相同,才能正常工作。否则它们将是两种不同的匿名类型,并且不相等。

    【讨论】:

    • 这正是我想要的。谢谢!
    猜你喜欢
    • 2011-11-16
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多