动态Linq查询不使用DateTime字段

时间:2013-04-25 20:37:40

标签: c# asp.net-mvc datetime dynamic-linq

我正在使用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”,例如

2 个答案:

答案 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;}
}