簡體   English   中英

如何在Linq中使用輸入參數按多列進行區分

[英]How to distinct by multiple columns with input parameter in 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。 .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查詢中,我不知道可以在哪里插入不同的輸入參數(: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是我可以設置的輸入參數。

嘗試將(s.COD_STUMENTO == pPod || pPod == null)添加到正在過濾T520_REL_STRUMENTI_SITI實體的Where子句中。 pPod應該是一個字符串變量。

請記住,如果在LINQ中使用DefaultIfEmpty(),它將轉換為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();
        }

您可以使用:

字符串查詢=((System.Data.Objects.ObjectQuery)query).ToTraceString(); 這將顯示從LINQ Queryable對象生成的SQL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM