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

问题描述 投票:1回答:2

我正在尝试将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 lambda
2个回答
2
投票

您有一个选择是使用两个单独的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版本似乎都有不同的条件。您可以自己添加它们。


1
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.