【问题标题】:How to filter DateTime string, no sqlserver commands如何过滤 DateTime 字符串,到 sql server 命令
【发布时间】:2019-08-27 02:48:04
【问题描述】:

我正在处理我的考试项目,我正在努力创建一个返回过滤订单列表的方法。我正在尝试过滤我之前使用代码第一个变体保存在数据库中的 by DateTime func,然后过滤它以调用 WindowsForm gridview 中的方法。

我尝试了多种我在互联网上看到的方法,但没有任何效果

    public IQueryable<Order> GetOrderFiltered(IQueryable<Order> OrdersQuery, Order order)
        {

            if (!string.IsNullOrWhiteSpace(order.Time))
            {
                OrdersQuery = OrdersQuery.Where(p => p.Time.Contains(DateTime.Today.ToString("dd/MM/yyyy HH:mm")));
            }

            var list = new List<Order>(OrdersQuery);
            return list;
        }
    }
namespace Data.Model
{
    public class Order
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public string Product { get; set; }
        public string PhoneNumber { get; set; }
        public string Location { get; set; }
        public DateTime Time { get; set; }
    }
}

如果有人可以帮助我,我将非常感激。

【问题讨论】:

  • 您希望如何过滤列表?只在今天的时间接收订单?
  • 您可以使用 linq 对其进行排序,而无需使用 sql。看到这个 - stackoverflow.com/questions/5344805/…
  • 如果您的日期时间作为字符串保存在数据库中,您应该这样做:p => p.Time.Contains(DateTime.Today.ToString("dd-MM-yyyy HH:mm") 您需要验证sql 日期时间格式 (dd-MM-yyyy) 或 (MM-dd-yyyy)
  • 你有机会把Order.Time改成DateTime类型吗? (也在您的数据库中)
  • 它是 (dd-MM-yyyy)

标签: c# string datetime filtering iqueryable


【解决方案1】:
public IQueryable<Order> GetTodayOrders(IQueryable<Order> OrdersQuery)
{
    return OrdersQuery.Where(o => o.Time >= DateTime.Today && o.Time < DateTime.Today.AddDays(1));
}

Order order 参数看起来没用(因为你只想要今天的订单):我删除了它。

我重命名了方法以更好地表达意图。

我假设由于返回类型仍然是IQueryable,因此它打算直接返回而无需任何中间结构(List)。

where 条件允许涵盖从今天 00:00:00 到 23:59:59 时间的订单。

【讨论】:

    【解决方案2】:

    我无法确定您希望如何过滤它,但如果您希望获取时间等于给定订单的订单列表,基本上可以执行以下操作。

    public IQueryable<Order> GetOrderFiltered(IQueryable<Order> OrdersQuery, Order order)
    {
        return OrdersQuery.Where(x => x.Time == order.Time);
    }
    

    这是我写的一个示例类来检查它:

    class Program
    {
        public class Order
        {
            public Order(int id, string time)
            {
                this.Id = id;
                this.Time = time;
            }
    
            public int Id { get; set; }
            public string Time { get; set; }
        }
    
        static void Main(string[] args)
        {
            List<Order> list = new List<Order>();
            list.Add(new Order(0, "1"));
            list.Add(new Order(1, "2"));
            list.Add(new Order(2, "1"));
            list.Add(new Order(3, "2"));
            list.Add(new Order(4, "1"));
    
    
            IQueryable<Order> test = GetOrderFiltered(list.AsQueryable(), new Order(121, "1"));
            // test has orders 0,2,4
        }
    
        public static IQueryable<Order> GetOrderFiltered(IQueryable<Order> OrdersQuery, Order order)
        {
            return OrdersQuery.Where(x => x.Time == order.Time);
        }
    }
    

    编辑。 阅读您的新评论后,您正在寻找的功能是:

    public IQueryable<Order> GetOrderFiltered(IQueryable<Order> OrdersQuery, Order order)
    {
        return OrdersQuery.Where(x => x.Time == DateTime.Today.ToString("dd/MM/yyyy"));
    }
    

    只有在您的时间看起来像这样的情况下 - 当然是“01/02/2005”。

    您可以随意使用您的 Time 属性,这取决于您。如果它在 dd/mm/yyyy 之后有几分钟和几秒钟,根据您的代码,那么您可以使用:

    return OrdersQuery.Where(x => x.Time.StartsWith(DateTime.Today.ToString("dd/MM/yyyy")));
    

    或“包含”而不是“StartsWith”

    【讨论】:

      猜你喜欢
      • 2012-05-05
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多