内部在LINQ Lambda中使用两个相等的内部连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内部在LINQ Lambda中使用两个相等的内部连接相关的知识,希望对你有一定的参考价值。

我正在尝试将Sql查询转换为Linq Lambda样式查询。认为这将是一件容易的事,但事实并非如此。

SQL Query如下;

select distinct t1.ID from table1 t1
    inner Join table2 t2on (t2.FromId= t1.Id or t2.ToId= t1.Id)
where t1.TenantId = 12
and t2.wId= 51

我遇到的所有例子都是针对一个子句加入到目前为止。我写了这样的东西

    actStaList = _db.t1
        .Join(_db.t2,
        s => s.ID,
        wf => wf.ToId,
        (s, wf) => new { t1= s, t2= wf }
        )
        .Where(a => a.t1.Tenant.Guid == _tenantGuid)
        .Select (m=>m.t1.ID)
        .ToList();

很明显,这不会像上面的SQL查询那样起作用,但它仍然是一个开始。我仍然无法想象我应该在INNER JOINDistinct关键字中添加第二部分。

答案

您有一个选择是使用两个单独的Linq查询并连接结果(并消除重复)。

 var left = t1.Join(t2,
                    s => s.ID,
                    wf => wf.ToId,
                    (s, wf) => new { t1= s, t2= wf }
                    ).Select(x=>x);

var right = t1.Join(t2,
                    s => s.ID,
                    wf => wf.FromId,
                    (s, wf) => new { t1= s, t2= wf }
                    ).Select(x=>x);

    var actStaList = left.Concat(right).Select(m=>m.t1.ID)
                                       .Distinct();

请注意我在示例中省略了OP中的Where子句,因为Sql版本和您尝试的Linq版本似乎都有不同的条件。您可以自己添加它们。

另一答案

LINQ Join语句仅支持equi-joins。对于其他类型的相等,您不能使用Join语句并且必须手动编写相等的代码。这在查询语法中要容易得多:

actStaList = (
    from t1 in _db.table1
    from t2 in _db.table2
    where t2.FromId == t1.Id || t2.ToId == t1.Id
    where t1.TenantId == 12 && t2.wId == 51
    select t1.ID
    ).Distinct();

对于记录,您可以通过将其作为SQL Distinct语句执行来避免使用EXISTS语句:

actStaList =
    from t1 in _db.table1
    where t1.TenantId == 12 
    where (from t2 in _db.table2
           where t2.wId == 51 && (t2.FromId == t1.Id || t2.ToId == t1.Id)
           select t2).Any()
    select t1.ID;

以上是关于内部在LINQ Lambda中使用两个相等的内部连接的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有内连接的 sql 查询转换为 linq lambda 表达式?

JAVA基础知识|lambda与stream

Linq to SQL 使用 Lambda 语法进行左外连接并在 2 列上连接(复合连接键)

lambda与匿名内部类

隐式内部连接 ​​- 它们是不是相等?

Ienumerable 和 DB 表之间的 LINQ 内部连接