使用LINQ to Entities的可选过滤器

时间:2014-03-28 01:15:26

标签: c linq-to-entities ienumerable

我上了这堂课:

public class PedidosList
    {
        public virtual int ID_Pedido { get; set; }        
        public virtual int Numero { get; set; }
        public virtual DateTime Fecha { get; set; }
        public virtual DateTime FechaEntrega { get; set; }
        public virtual int ID_Cliente { get; set; }
        public virtual string Cliente { get; set; }
        public virtual Decimal Bruto { get; set; }
        public virtual Decimal Neto { get; set; }
        public virtual Boolean Aprobado { get; set; }
        public virtual string Observaciones { get; set; }
        public virtual Boolean Entregado { get; set; }
    }

表示从POCO类映射到具有实体框架的SQL表的字段子集。然后使用此函数使用Linq to Entities进行可选过滤,并返回一个IENumerable集合:

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();
            }
        }

所以我的问题:这是实现这一目标的最佳途径吗?我可以制作一个可选的过滤器,在Pedidos上的某个字段上添加一个新的位置而不是在PedidosList上吗?示例:我必须将字段ID_Cliente添加到PedidosList,这样即使我不想在PedidosList上进行过滤也可以进行过滤。谢谢!

1 个答案:

答案 0 :(得分:0)

我很晚才回答这个问题,但我刚刚遇到过它。我对你所做的事情并不特别不舒服,我认为这主要是个人偏好和你认为可读的问题。但如果我要写它,我可能会做这样的事情。

public IEnumerable<PedidosList> Pedidos_Listar(string sComprobante, Clientes MyCliente = null, DateTime? dDesde = null, DateTime? dHasta = null, bool bCumplidos = false)
{           
    using (var context = new OhmioEntities())
    {
        return from Pedidos in context.Pedidos
               join Clientes in context.Clientes on Pedidos.ID_Cliente equals Clientes.ID_Cliente
               where (Pedidos.ID_Comprobante == sComprobante) &&
                     (MyCliente == null || Pedidos.ID_Cliente == MyCliente.ID_Cliente) &&
                     (dDesde == null || dHasta == null || Pedidos.Fecha >= dDesde && Pedidos.Fecha <= dHasta) &&
                     (bCumplidos || Pedidosi.Entregado)
               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()。这否定了使用IEnumerable<T>的一些好处。