动态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",例如
将日期转换为实际日期对象并使用Compare()
方法。
或者,您可以将两者都转换为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;}
}