2015-04-23 5 views
0

У меня есть таблицы tre T020_CLIENTI, T021_SITI, T520_REL_STRUMENTI_SITI, которые я бы присоединил, а затем различал T020.Ragione_sociale, T520.DA_DATA, T520.A_DATA, но получал в качестве возвращаемых параметров T020.Ragione_sociale , T020.id_cliente, T520.cod_stumento, T520.DA_DATA, T520.A_DATAКак выделить несколько столбцов с входным параметром в Linq

мои таблицы

public partial class T020_CLIENTI 
{ 
    public decimal ID_CLIENTE { get; set; } 
    public Nullable<decimal> ID_COMUNE { get; set; } 
    public Nullable<decimal> ID_CONSORZIO { get; set; } 
    public string COD_LINEA_ATTIVITA { get; set; } 
} 

public partial class T021_SITI 
{ 
    public decimal ID_SITO { get; set; } 
    public Nullable<decimal> ID_FORNITORE { get; set; } 
    public Nullable<decimal> ID_CLIENTE { get; set; } 
} 
public partial class T520_REL_STRUMENTI_SITI 
{ 
    public string COD_STUMENTO { get; set; } 
    public decimal ID_SITO { get; set; } 
    public System.DateTime DA_DATA { get; set; } 
    public System.DateTime A_DATA { get; set; } 
} 

мой LINQ запрос

using (var cont = DALProvider.CreateEntityContext()) 
{ 

    var query = 
    from cliente in cont.T020_CLIENTI 
    from sito 
    in cont.T021_SITI 
     .Where(s => s.ID_CLIENTE == cliente.ID_CLIENTE) 
     .DefaultIfEmpty() 
    from relStrumenti 
    in cont.T520_REL_STRUMENTI_SITI 
     .Where(s => s.ID_SITO == sito.ID_SITO) 
     .DefaultIfEmpty() 
    select new 
    { 
     clienteRec = cliente, 
     sitoRec = sito, 
     relStrumentiRec = relStrumenti 
    }; 
    if (!string.IsNullOrEmpty(aiFiltro.RAGIONE_SOCIALE)) 
     query = query.Where(i => i.clienteRec.RAGIONE_SOCIALE.ToUpper().Contains(aiFiltro.RAGIONE_SOCIALE.ToUpper())); 
    var vRes = (from clienteDef in query 

    select new ClienteFiltrato 
    { 
     RAGIONE_SOCIALE = clienteDef.clienteRec.RAGIONE_SOCIALE, 
     ID_CLIENTE = clienteDef.clienteRec.ID_CLIENTE, 
     COD_STRUMENTO = clienteDef.relStrumentiRec.COD_STUMENTO, 
     DATA_DA = clienteDef.relStrumentiRec.DA_DATA, 
     DATA_A = clienteDef.relStrumentiRec.A_DATA 
    }) ; 
    return vRes.AsQueryable(); 
} 

б у в моем запросе LINQ я не знаю, где я могу вставить отчетливый и входной параметр (: pPOD), чтобы получить мой LINQ, что в оракулу запрос:

SELECT DISTINCT t020.ragione_sociale, 
       da_data, 
       a_data, 
       t020.id_Cliente, 
       :pPOD 
    FROM t020_clienti t020, t021_siti t021, T520_REL_STRUMENTI_SITI t520 
    WHERE  t020.id_cliente = t021.id_cliente 
     AND t021.id_sito = t520.id_sito 
AND (:pPOD is null or t520.cod_stumento = :pPOD) 
ORDER BY da_data 

где: pPOD является входным параметром, который я мог бы иметь установлен или нет.

ответ

0

Попробуйте добавить (s.COD_STUMENTO == pPod || pPod == null) в предложение Where, где вы фильтруете объект T520_REL_STRUMENTI_SITI. pPod должен быть строковой переменной.

Обратите внимание, что если вы используете DefaultIfEmpty() в LINQ, это будет переведено на левое соединение в SQL. Модифицированный запрос следующим образом:

string pPod = null; 
using (var cont = DALProvider.CreateEntityContext()) 
     { 

      var query = 
      (from cliente in cont.T020_CLIENTI 
      from sito 
      in cont.T021_SITI 
       .Where(s => s.ID_CLIENTE == cliente.ID_CLIENTE) 
       .DefaultIfEmpty() 
      from relStrumenti 
      in cont.T520_REL_STRUMENTI_SITI 
       .Where(s => s.ID_SITO == sito.ID_SITO && (s.COD_STUMENTO == pPod || pPod == null)) 
       .DefaultIfEmpty() 
      select new 
      { 
       clienteRec = cliente.Distinct(), 
       sitoRec = sito, 
       relStrumentiRec = relStrumenti 
      }); 
      if (!string.IsNullOrEmpty(aiFiltro.RAGIONE_SOCIALE)) 
       query = query.Where(i => i.clienteRec.RAGIONE_SOCIALE.ToUpper().Contains(aiFiltro.RAGIONE_SOCIALE.ToUpper())); 
      var vRes = (from clienteDef in query 

      select new ClienteFiltrato 
      { 
       RAGIONE_SOCIALE = clienteDef.clienteRec.RAGIONE_SOCIALE, 
       ID_CLIENTE = clienteDef.clienteRec.ID_CLIENTE, 
       COD_STRUMENTO = clienteDef.relStrumentiRec.COD_STUMENTO, 
       DATA_DA = clienteDef.relStrumentiRec.DA_DATA, 
       DATA_A = clienteDef.relStrumentiRec.A_DATA 
      }).Distinct() ; 
      return vRes.AsQueryable(); 
     } 

Вы можете использовать:

string query = ((System.Data.Objects.ObjectQuery)query).ToTraceString(); This will show you the generated SQL from LINQ Queryable object.

+0

таким образом, если pPod = нулевой запрос возвращает мне много RAGIONE_SOCIALE вместо я бы получить отчетливое RAGIONE_SOCIALE –

+0

модернизировали запросов LINQ. Добавлено .Distinct() в конец vReq-запрос. –

+0

Я пробовал, но он не работает, кажется, кажется, не работает –

Смежные вопросы