0

我正在使用动态 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.Date == 2012.01.01”

4

2 回答 2

3

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

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

或者,您可以将两者都转换为 long 并以这种方式进行比较。您正在尝试将对象与文字进行比较。

编辑:您还可以将它们都转换为字符串并进行比较。重要的是您正在将苹果与苹果进行比较。不适用于 Date 对象。=)

于 2013-04-25T20:45:50.343 回答
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;}
}
于 2013-04-25T20:52:58.547 回答