Внутреннее объединение с двумя равенствами внутри в предложении в LINQ Lambda - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь преобразовать запрос Sql в запрос стиля Linq Lambda.Думал, что это будет что-то легкое, но оказалось, что это не так.

SQL-запрос выглядит следующим образом;

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.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Оператор LINQ Join поддерживает только equi-join .Для других типов равенства вы не можете использовать оператор 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();

Для записи вы можете избежать оператора Distinct, выполнив его как оператор SQL 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;
0 голосов
/ 03 января 2019

Один из вариантов - использовать два отдельных запроса 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();

Обратите внимание, что в примере я исключил условие Where, как и в OP, и для версии Sql, и для вашей версии Linq, по-видимому, существуют разные условия. Вы можете добавить их самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...