none
Como fazer “OR” entre SubQuerys utilizando LINQ C# RRS feed

  • Pergunta

  • Gostaria de implementar com LINQ C# (Utilizando NHibernate como ORM), a seguinte query:
       
    return (from t1 in Session.Query<Tabela1>()
    join t2 in Session.Query<Tabela2>()
    on t1 equals t2.T1
    where (from t3 in Session.Query<Tabela3>()
    where
    t3.Tabela == 1 && t3.Atualizacao >= dataAtualizacao
    select t3.Chave).Contains(t1.Id)
    /* aqui teria que ser um 'or' (||) ao invés de um 'and' (&&), como é feito por default */
    where (from t3 in Session.Query<Tabela3>()
    where
    t3.Tabela == 2 && t3.Atualizacao >= dataAtualizacao
    select t3.Chave).Contains(t2.Id)
    select t1).Distinct().ToList();

    A query equivalente em SQL que quero gerar seria similar a está:

       
    SELECT * FROM TABELA1 T1
    LEFT OUTER JOIN TABELA2 AS T2 ON T2.T1 = T1.ID
    WHERE
    (T1.ID IN (SELECT T3.CHAVE FROM TABELA3
    WHERE T3.CODIGOTABELA = 1 AND T3.ATUALIZACAO >= '10/25/2000 13:05:00')
    OR /* Esse OR é que não consigo implementar com LINQ, da maneira que está a expressão LINQ nessa linha gera um AND */
    T2.ID IN (SELECT T3.CHAVE FROM TABELA3
    WHERE T3.CODIGOTABELA = 2 AND T3.ATUALIZACAO >= '10/25/2000 13:05:00'))

    O problema é que não achei nenhuma forma de fazer a expressão "OR" entre as 2 subquerys , e por default em LINQ a expressão gerada é um "AND".
    Há alguma forma de fazer a expressão "OR", entre as duas subquerys?

    Obs: Poderia também utilizar Lambda Expressions, ao invés de LINQ.

    Fernando

    segunda-feira, 12 de maio de 2014 13:26

Respostas

  • Consegui resolver com a resposta do colega Paulo Morgado no SOPT.

    Era só no lugar do where encadeado utilizar o operado ||:

    return (from t1 in Session.Query<Tabela1>()
            join t2 in Session.Query<Tabela2>()
            on t1 equals t2.T1
            where (from t3 in Session.Query<Tabela3>()
                   where
                   t3.Tabela == 1 && t3.Atualizacao >= dataAtualizacao
                   select t3.Chave).Contains(t1.Id)
            || (from t3 in Session.Query<Tabela3>()
                   where
                   t3.Tabela == 2 && t3.Atualizacao >= dataAtualizacao
                   select t3.Chave).Contains(t2.Id)
            select t1).Distinct().ToList();


    Fernando


    • Marcado como Resposta NotNet segunda-feira, 12 de maio de 2014 14:41
    • Editado NotNet segunda-feira, 12 de maio de 2014 14:42 Erro ortografico
    segunda-feira, 12 de maio de 2014 14:21