【问题标题】:Query LINQ doesn't work on variable string查询 LINQ 不适用于变量字符串
【发布时间】:2015-04-13 16:47:49
【问题描述】:

简单地说,这是可行的:

Database db = DatabaseWrapper.GetDatabase();
string dd = e.ParsedData.Date.ToString("yyyyMMdd");
var todaysflights = db.Flights.GetList(x => x.ScheduleDateTime.Contains("20150413")).ToList();

但事实并非如此,

Database db = DatabaseWrapper.GetDatabase();
string dd = e.ParsedData.Date.ToString("yyyyMMdd");
var todaysflights = db.Flights.GetList(x => x.ScheduleDateTime.Contains(dd)).ToList();

这是在事件处理程序中,我可以向您保证,当我将它打印到控制台时,dd 中的值正好是“20150413”。

更新:

GetList 方法工作正常,因为我从中得到了预期的结果,它返回了一个 IEnumerable:

    var todaysflights = db.Flights.GetList(x =>     x.ScheduleDateTime.Contains("20150413")).ToList();

这是该日期的航班列表。

我使用 Contains 是因为 ScheduleDateTime 字段类似于“20150413164500”,而不是 DateTime。我也可以使用 StartsWith,但我相信这不是问题。

当我说不起作用时,我的意思是当我使用变量“dd”运行 GetList 时,我得到一个空列表,而当使用硬编码字符串“20150413”时,我得到一个包含 1868 个结果的列表。

打印到控制台时 dd 的值正好是“20150413”。

e.ParsedData 有一堆从条形码阅读器解析的数据,并且 Date 属性的类型是 DateTime,这就是为什么 e.ParsedData.Date.ToString("yyyyMMdd") 给了我想要的格式。

对于这个不完整的问题,我真的很抱歉,我写的时候刚刚下班。

感谢大家的快速回复。

更新 2

我一直在测试,下面的代码返回了预期的结果(包含一堆数据的列表):

var dd = e.ParsedData.Date.ToString("yyyyMMdd");
        var todaysflights = _db.Flights.GetList(x => x.ScheduleDateTime.Contains(""+dd)).ToList();

任何人都可以说出为什么这个 ""+dd 使表达式给我预期的结果不是空列表?

谢谢

【问题讨论】:

  • 如果您已验证 GetList 自定义函数的输入是正确的,那么问题出在该函数上。如果您想要解决问题的答案,您必须提供GetList 的代码。
  • 你说它不起作用是什么意思?例外?结果不正确?
  • dd 的值是否返回您所期望的值?
  • 请更具体。请提供可靠地重现问题的a good, minimal, complete code example。请比“这不是”更具体地说明问题。清楚地说明您拥有的代码是做什么的,以及它与您希望它做什么的不同之处。请阅读stackoverflow.com/help/how-to-ask,了解如何以清晰、可回答的方式提出您的问题。
  • 我已经更新了我的问题,谢谢大家。

标签: c# linq entity-framework


【解决方案1】:

代码中有很多奇怪的地方。 我假设GetList 返回一个列表,那么为什么GetList().ToList() 和 LINQ x.ScheduleDateTime.Contains(dd) ScheduleDateTime 是什么? string 还是 DateTime?根据您的问题,它被称为string,但它的名称是DateTime。 (最后我假设e.ParsedDataDateTime 你可以改写e.ParsedData.ToString("yyyyMMdd");)。

因此,根据我的假设,GetList 实际上返回一个列表,而ScheduleDateTime 包含DateTime

所以我会尝试直接比较日期时间,而不是将列表中的工作加倍。

Database db = DatabaseWrapper.GetDatabase();
DateTime dd = e.ParsedData.Date;
var todaysflights = db.Flights.GetList(x => x.ScheduleDateTime.Date == dd);

如果所有其他方法都失败,则将其放入foreach。然后你可以很好地调试每个循环,交替try/catch

Database db = DatabaseWrapper.GetDatabase();
DateTime dd = e.ParsedData.Date;
List<Flight> todaysflights = new List<Flight>();
foreach (var a in db.Flights.GetList()){
    try
    {
        if(a.ScheduleDateTime.Date() == dd){
            todaysflights.Add(a);
        }
    }
    catch(Exception ex)
    {
        //Print some caught error but don't break program
    }
}

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多