动态Linq查询不能与DateTime字段一起工作

本文关键字:字段 一起 工作 DateTime Linq 查询 不能 动态 | 更新日期: 2023-09-27 18:11:00

我正在使用动态linq为我的MVC应用程序提供数据,我有DateTime字段的麻烦。

我解析的对象有一个System。Datetime字段,我想检查日期是否对应。

所以我试着像这样构建字符串(我正在通过动态字典解析以获取数据):

string dateToParse = keyValuePair.Value;
DateTime objDate = DateTime.Parse(dateToParse);
valuesToUse.Add("OBJ_DATE.Date == " + objDate.ToShortDateString());

当我加载数据时,我这样做:

var objQry = from pl in m_Db.OBJS.Where(whereConditions)
                               select pl;

whereConditions变量是我在拥有所有数据时构建的字符串。

但是当数据到达datetime字段时,应用程序会崩溃,并出现以下语句:

Operator '==' incompatible with operand types 'DateTime' and 'Int32'

如何使用动态Linq检查DateTime字段?我尝试了很多选项,比如把objDate没有ToShortDateString,但具有相同的效果。

编辑:

" OBJ_DATE。日期== 2012.01.01",例如

动态Linq查询不能与DateTime字段一起工作

将日期转换为实际日期对象并使用Compare()方法。

http://msdn.microsoft.com/en-us/library/system.datetime.compare.aspx

或者,您可以将两者都转换为long类型并以这种方式进行比较。你试图将一个对象与一个文字进行比较。

Edit:您还可以将它们都转换为字符串并进行比较。重要的是你是在比较苹果和苹果。不是苹果到日期对象。div =)

也许我错过了什么,但你不需要用引号或其他东西来把你的约会当作约会吗?我试着记住动态Linq是如何工作的,但必须有一些方法告诉扩展方法,你的标准不是一个基本类型?

OBJ_DATE.Date == "2012.01.01"

UPDATE -啊哈,我知道代码看起来很有趣。尝试将其作为参数传递给扩展方法,而不是尝试将其作为一个内联字符串传递。我想出了这个,但我不能再花时间在上面了。因此,您必须深入研究如何组合多个表达式,以便您可以动态地构建它们,就像您在问题中所说的那样。

这是一个副本&粘贴自LinqPad

public void Main()
{
    var people = new List<Person>()
    {
        new Person(){Name = "Jpe", BirthDate =DateTime.Parse("March 18, 1980")},
        new Person(){Name = "Bob", BirthDate =DateTime.Parse("July 22, 1989")},
        new Person(){Name = "Sarah", BirthDate =DateTime.Parse("Nov 5, 1995")}
    };
    var firstExpression = System.Linq.Dynamic.DynamicExpression.ParseLambda<Person, bool>("BirthDate = @0", DateTime.Parse("July 22, 1989"));
    //var secondExpression = System.Linq.Dynamic.DynamicExpression.ParseLambda<Person, bool>("Name = @0", "Nick");
    //var finalExpression = Expression.And(firstExpression, secondExpression);
    people.AsQueryable().Where(firstExpression).FirstOrDefault().Dump();
}
public class Person
{
    public string Name{get;set;}
    public DateTime BirthDate {get;set;}
}