Динамический запрос Linq не работает с полем DateTime

Я использую 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'

Как проверить поле DateTime с помощью динамического Linq? Я пробовал много вариантов, например, поставить objDate без ToShortDateString, но с тем же эффектом.

РЕДАКТИРОВАТЬ:

"OBJ_DATE.Date == 2012.01.01", например


person hsim    schedule 25.04.2013    source источник
comment
Два ваших примера кода, похоже, не имеют ничего общего друг с другом.   -  person Bobson    schedule 26.04.2013
comment
Вы должны написать весь запрос.   -  person Yatrix    schedule 26.04.2013
comment
OBJ_DATE.Date == 2012.01.01, например.   -  person hsim    schedule 26.04.2013
comment
И я использую динамический запрос для своего приложения, которое до сих пор работало довольно хорошо.   -  person hsim    schedule 26.04.2013


Ответы (2)


Преобразуйте свою дату в объект фактической даты и используйте метод Compare().

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

Или вы можете преобразовать оба в long и сравнить их таким образом. Вы пытаетесь сравнить объект с литералом.

Изменить. Вы также можете преобразовать их в строки и сравнить. Важно то, что вы сравниваете яблоки с яблоками. Не яблоки для объектов Date. знак равно

person Yatrix    schedule 25.04.2013
comment
Как вы делаете это с помощью динамического linq и строки? - person hsim; 26.04.2013
comment
Я имею в виду, я понимаю, что вы говорите, но мне нужно отформатировать строку, чтобы динамический linq знал, что я прошу из нее... - person hsim; 26.04.2013
comment
@HerveS Я не уверен. Я никогда не пробовал linq таким образом, но если он просто читает эту строку как код, то вы, вероятно, можете сделать DateTime.Compare(OBJ_Date.Date, DateTime.Parse(2012.01.01)). Результатом сравнения является int, а 0 означает, что они равны. - person Yatrix; 26.04.2013
comment
@HerveS Я тоже нашел это, что может быть полезно: stackoverflow.com/questions/2818044/ - person Yatrix; 26.04.2013

Может быть, я что-то упускаю, но разве вам не нужно заключать дату в кавычки или что-то еще, чтобы она воспринималась как дата? Я пытаюсь вспомнить, как работает 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;}
}
person Nick Albrecht    schedule 25.04.2013
comment
Хороший вопрос. Я проверю это. - person hsim; 26.04.2013
comment
Нет, я пробовал писать valuesToUse.Add(OBJ_DATE.Date == \ + objDate + \);` и снова возникает та же ошибка. - person hsim; 26.04.2013