【问题标题】:Optional filters using LINQ to Entities使用 LINQ to Entities 的可选过滤器
【发布时间】:2014-05-07 07:12:30
【问题描述】:

我上了这门课:

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 上,我也可以进行过滤。谢谢!

【问题讨论】:

    标签: c linq-to-entities ienumerable


    【解决方案1】:

    我很晚才回答这个问题,但我刚刚发现它。我不会对您所做的事情感到特别不舒服,我认为这主要取决于个人喜好以及您认为可读的内容。但如果我要写它,我可能会做这样的事情。

    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&lt;T&gt; 的一些好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 2017-09-24
      • 2011-06-10
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多