首页 > 解决方案 > C# 计算 LINQ 查询中的字段

问题描述

我需要一些帮助来计算我的 Linq 查询中的属性。

我知道我需要在某处使用“let”,但我想不通!

所以,首先我有这个方法从数据库中获取我的列表:

public BindingList<Builders> GetListBuilders()
    {
        BindingList<Builders> builderList = new BindingList<Builders>();
        var ctx = new IWMJEntities();
        var query = (from l in ctx.tblBuilders
                     select new Builders
                     {
                         ID = l.BuilderID,
                         Projeto = l.NomeProjeto,
                         Status = l.Status,
                         DataPedido = l.DataPedido,
                         DataPendente = l.DataPendente,
                         DataEntregue = l.DataEntregue,
                         DataAnulado = l.DataAnulado
                     });
        foreach (var list in query)
            builderList.Add(list);
        return builderList;
    }

然后,我有一个函数可以根据状态计算日期之间的天数:

public int GetDays()
    {
        int Dias = 0;
        foreach (var record in GetListBuilders)
        {
            if (record.Status == "Recebido")
            {
                Dias = GetBusinessDays(record.DataPedido, DateTime.Now);
            }
            else if (record.Status == "Pendente")
            {
                Dias = GetBusinessDays(record.DataPedido, (DateTime)record.DataPendente);
            }
            else if (record.Status == "Entregue")
            {
                Dias = GetBusinessDays(record.DataPedido, (DateTime)record.DataEntregue);
            }
            else if (record.Status == "Anulado")
            {
                Dias = GetBusinessDays(record.DataPedido, (DateTime)record.DataAnulado);
            }
        }
        return Dias;
    }

我需要在 DataGridView 中调用 GetDays 来给出每条记录的天数。

我的大问题是,我如何得到这个?将它包含在 Linq 查询中?调用 GetDays()(需要将每条记录的 ID 传递给 GetDays() 函数)!?

有什么帮助吗?

谢谢

标签: c#linq

解决方案


我认为创建扩展方法会更容易:

public static int GetBusinessDays(this Builders builder) // or type of ctx.tblBuilders if not the same
{
  if (builder == null) return 0;

  switch(builder.status)
  {
    case "Recebido": return GetBusinessDays(builder.DataPedido, DateTime.Now);
    case "Pendente": return GetBusinessDays(builder.DataPedido, (DateTime)builder.DataPendente);
    case "Entregue": return GetBusinessDays(builder.DataPedido, (DateTime)builder.DataEntregue);
    case "Anulado": GetBusinessDays(builder.DataPedido, (DateTime)builder.DataAnulado);
    default: return 0;
  }
}

然后,这样称呼它:

public BindingList<Builders> GetListBuilders()
    {
        BindingList<Builders> builderList = new BindingList<Builders>();
        var ctx = new IWMJEntities();
        var query = (from l in ctx.tblBuilders
                     select new Builders
                     {
                         ID = l.BuilderID,
                         Projeto = l.NomeProjeto,
                         Status = l.Status,
                         DataPedido = l.DataPedido,
                         DataPendente = l.DataPendente,
                         DataEntregue = l.DataEntregue,
                         DataAnulado = l.DataAnulado,
                         Dias = l.GetBusinessDays()
                     });
        foreach (var list in query)
            builderList.Add(list);
        return builderList;
    }

为了做得更好,要将对象转换为新对象,您应该创建一个映射器。


推荐阅读