如何在Linq中使用带有输入参数的多列进行区分

时间:2015-04-23 07:56:18

标签: c# oracle linq

我有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

我的桌子是

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查询中,我不知道在哪里可以插入distinct和输入参数(:pPOD)来获取我在oracle查询中的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是我可以设置或不设置的输入参数。

1 个答案:

答案 0 :(得分:0)

尝试将(s.COD_STUMENTO == pPod || pPod == null)添加到您正在过滤T520_REL_STRUMENTI_SITI实体的Where子句中。 pPod应该是一个字符串变量。

请记住,如果在LINQ中使用DefaultIfEmpty(),则会在SQL中将其转换为left join。 修改后的查询如下:

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)查询).ToTraceString();   这将显示LINQ Queryable对象生成的SQL。