查询LINQ不适用于变量字符串

时间:2015-04-13 16:47:50

标签: c# linq entity-framework

简单地说,这有效:

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使表达式给我的结果预期不是空的List?

谢谢

1 个答案:

答案 0 :(得分:0)

代码上发生了很多奇怪的事情。 我假设GetList返回一个列表,为什么GetList().ToList() 和LINQ x.ScheduleDateTime.Contains(dd)什么是ScheduleDateTimestringDateTime?根据您的问题,它被声明为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
    }
}