2014-03-28 34 views
0

我在一類這種功能:LINQ投影之後可選參數過濾

public IEnumerable<PedidosList> Pedidos_Listar(string sComprobante, Clientes MyCliente = null, DateTime? dDesde = null, DateTime? dHasta = null, bool bCumplidos = false) 
{   
    using (var context = new OhmioEntities()) 
    { 
     IEnumerable<PedidosList> query = 
      from Pedidos in context.Pedidos 
      join Clientes in context.Clientes on Pedidos.ID_Cliente equals Clientes.ID_Cliente 
      where Pedidos.ID_Comprobante == sComprobante      
      select new PedidosList {ID_Pedido = Pedidos.ID_Pedido, Fecha=Pedidos.Fecha, Aprobado=Pedidos.Aprobado, Bruto=Pedidos.Bruto, Cliente=Clientes.RazonFantasia, 
       FechaEntrega=Pedidos.FechaEntrega, Neto=Pedidos.Neto, Numero=Pedidos.Numero, Observaciones=Pedidos.Observaciones, Entregado=Pedidos.Entregado, ID_Cliente=Pedidos.ID_Cliente }; 

     if (MyCliente != null) query = query.Where(i => i.ID_Cliente == MyCliente.ID_Cliente); 
     if (MyCliente != null) query = query.Where(i => i.ID_Cliente == MyCliente.ID_Cliente); 
     if (dDesde != null && dHasta != null) query = query.Where(i => i.Fecha >= dDesde && i.Fecha <= dHasta); 
     if (bCumplidos == false) query = query.Where(i => i.Entregado == false);     
     return query.ToList(); 
    } 
} 

的想法是使用LINQ投影來填充,其中多個可選的過濾器參數進行評估的自定義類對象。我的問題是:出於性能和封裝的原因,我可以在應用過濾器後選擇投影后的投影嗎?在我的代碼投影完成之前,所以我只能過濾我的自定義類的字段,但我想過濾原來的類字段。謝謝。

+1

是的,你可以。當你嘗試這樣做時,有什麼問題? – MarcinJuraszek

+0

我不知道如何。我需要的是讓SELECT NEW PedidosList在添加附加的WHERE clausule之後。我supose需要找到一種方法來添加可選過濾器LINQ INSIDE LINQ語句,但我不知道這是否可能。我還定義查詢爲IEnumerable 所以過濾器應用一旦對象已被創建。有任何想法嗎? – ericpap

回答

1
var query = 
    from Pedidos in context.Pedidos 
    join Clientes in context.Clientes on Pedidos.ID_Cliente equals Clientes.ID_Cliente 
    where Pedidos.ID_Comprobante == sComprobante  
    select new { Pedidos, Clientes };    

if (MyCliente != null) 
{ 
    query = query.Where(i => i.Pedidos.ID_Cliente == MyCliente.ID_Cliente); 
    query = query.Where(i => i.Periodos.ID_Cliente == MyCliente.ID_Cliente); 
} 
if (dDesde != null && dHasta != null) 
    query = query.Where(i => i.Pedidos.Fecha >= dDesde && i.Pedidos.Fecha <= dHasta); 
if (bCumplidos == false) 
    query = query.Where(i => i.Pedidos.Entregado == false);  

return (from x in query 
     let Pedidos = x.Pedidos 
     let Clientes = x.Clientes 
     select new PedidosList {ID_Pedido = Pedidos.ID_Pedido, Fecha=Pedidos.Fecha, Aprobado=Pedidos.Aprobado, Bruto=Pedidos.Bruto, Cliente=Clientes.RazonFantasia, FechaEntrega=Pedidos.FechaEntrega, Neto=Pedidos.Neto, Numero=Pedidos.Numero, Observaciones=Pedidos.Observaciones, Entregado=Pedidos.Entregado, ID_Cliente=Pedidos.ID_Cliente 
     }).ToList(); 
+0

這正是我需要的!你是個天才!謝謝! – ericpap

+0

只是一個細節:當我做ToList()正確時,查詢只發送到數據庫?只有在查詢執行後才創建自定義類並返回過濾的數據?謝謝 – ericpap

+0

是的,沒錯。通過你以前的方法,所有'Where'過濾被執行爲LINQ to Objects查詢,因爲你聲明'query'爲'IEnumerable '。使用我的代碼,所有條件和預測都將由DB完成,這應該快得多。 – MarcinJuraszek