【问题标题】:LINQ to entites does not recognize Convert.ToDatetime methodLINQ to 实体无法识别 Convert.ToDatetime 方法
【发布时间】:2016-06-30 06:23:03
【问题描述】:

编辑链接到前一个问题的所有其他答案对我都不起作用,因为他们要么使用两个表,要么知道他们正在寻找什么开始日期。

我有以下 LINQ 查询,我试图从表中获取过去 14 天的数据。 LINQ 无法识别 Convert.ToDatetime 方法。 Query_Date 列是一个类型字符串,我无法更改它。我如何获得我需要的数据?

       var logs = (from bwl in db.UserActivities
       where Convert.ToDateTime(bwl.Query_Date) >= DateTime.Now.AddDays(-14)                               
                          select new
                          {
                              Id = bwl.Id,
                              UserEmail = bwl.UserEmail                                 

                          }).ToList();

【问题讨论】:

标签: c# linq


【解决方案1】:

所以我无法得到我想要的,因为我必须进行太多更改,所以我正在做的解决方法是:我正在使用此代码

var logs = db.UserActivities.ToList().Take(100);

这将为我提供最后 100 个条目。我将提供更多或更少条目的选项,然后他们可以在数据表的搜索栏中按日期过滤它。

这不是很好,但时间对我不利,这就足够了。

【讨论】:

    【解决方案2】:

    您是否至少每天都输入数据?如果是这样,那么这样的事情呢:

    var oldestDate = DateTime.Now.AddDays(-14); 
    var dateString = oldestDate.ToString(*/ your date format */);
    var oldestID = db.UserActivities.First(b => b.Query_Date == dateString).Id;
    var logs = (from bwl in db.UserActivities
                where bwl.Id > oldestID
                select new {
                    Id = bwl.Id,
                    UserEmail = bwl.UserEmail
                }).ToList();
    

    基本上,您会在该日期找到一条记录,并使用它的 ID 作为该日期的代理。这仅在某些情况下有效(即,如果 ID 按日期顺序排列)。

    这也不能保证是该日期最旧的条目,但这可以通过使用 ID 顺序来实现:

    var oldestID = db.UserActivities.Where(b => b.Query_Date == dateString)
                                    .OrderBy(b => b.Id)
                                    .First().Id;
    

    如果您不介意获取第 15 天的未知百分比,则在添加天数时使用 -15 而不是 -14 更懒惰。

    【讨论】:

      【解决方案3】:

      Convert.ToDateTime 如果您的 Query_Date 格式正确,则可以使用。如果不是,请检查您的字符串表达式是否为可转换格式。

      我测试了下面的代码,当我假设Query_DateDateTime.toString() 的一种形式时它工作正常。

      var logs = (from bwl in db.UserActivities
              where DateTime.Now - Convert.ToDateTime(bwl.Query_Date) <= TimeSpan.FromDays(14)
              select new
              {
                  Id = bwl.Id,
                  UserEmail = bwl.UserEmail
              }).ToList();
      

      我还用你的 where 表达式 Convert.ToDateTime(bwl.Query_Date) &gt;= DateTime.Now.AddDays(-14) 进行了测试,并确认它给出了相同的结果。

      【讨论】:

      • 我在表格中的格式是dd/MM/yyyy。我仍然让 LINQ to Entities 无法识别“System.DateTime ToDateTime(System.String)”方法,并且该方法无法转换为存储表达式。不管我把它变成什么格式
      • @user6295447 // 你能试试这个吗? stackoverflow.com/a/2556050/361100 首先调用ToList() 以便先倒入内存。它效率不高,但似乎是唯一的选择,除非您的时间位本身没有意义。
      • 我想要最后两周的原因是该表包含六个月的数据,我不想带回所有数据然后显示最后两周。我只想带回所需的数据。我将暂时离开它,稍后当我有更多时间时再回来。我可能需要做一些改变才能得到我想要的东西
      • @user6295447 // 如果id(或其他)值保证按顺序增加,则它可能不需要获取所有数据希望。当然,迭代作业可以解析给定的日期并获取其中的一部分。无论如何,它不整洁:(
      猜你喜欢
      • 1970-01-01
      • 2016-09-23
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 2012-04-03
      • 2021-11-06
      相关资源
      最近更新 更多