我正在尝试将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 JOIN
和Distinct
关键字中添加第二部分。
您有一个选择是使用两个单独的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;