我正在使用Dynamic 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
变量是我拥有所有数据时构建的字符串。
但是当数据点击日期时间字段时,应用程序会崩溃并显示以下语句:
Operator '==' incompatible with operand types 'DateTime' and 'Int32'
如何使用动态Linq检查DateTime字段?我尝试了很多选项,比如把objDate放在没有ToShortDateString的情况下,但效果相同。
“OBJ_DATE.Date == 2012.01.01”,例如
答案 0 :(得分:3)
将您的日期转换为实际日期对象,并使用Compare()
方法。
http://msdn.microsoft.com/en-us/library/system.datetime.compare.aspx
或者,您可以将两者都转换为long并以这种方式进行比较。您正在尝试将对象与文字进行比较。
修改:您还可以将它们转换为字符串并进行比较。重要的是你要比较苹果和苹果。不是苹果到Date对象。 =)
答案 1 :(得分:3)
也许我错过了一些东西,但是你不必用引号或其他东西来包装日期以将它作为约会对待吗?我试图记住Dynamic Linq是如何工作的,但必须有一些方法告诉扩展方法你的标准不是原始类型吗?
OBJ_DATE.Date == "2012.01.01"
更新 - 啊哈,我知道代码看起来很有趣。尝试将其作为参数传递给扩展方法,而不是尝试将其作为一个内联字符串。我能够想出这个,但我不能再花时间了。因此,您必须深入研究如何组合多个表达式,以便您可以按照您在问题中所说的方式动态构建它们。
这是一个副本&从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;}
}