Я уже давно бьюсь над этой проблемой.Есть несколько подобных случаев, но решения не были применимы в моем случае.
У меня есть метод, который возвращает запрос фильтра в строковом формате.Метод имеет логику для разных типов данных, устанавливает правильные значения, имена столбцов и т. Д.
string filterQuery = GetFilterQuery(params);
rows = rows.Where(filterQuery);
Моя проблема в том, что у меня есть Nullable DateTime
в базе данных и у меня есть String
представление на стороне кода.
Я пробовал следующие запросы (String
представление может быть неправильным в настоящее время):
"BirthDate.ToString() = \"16.2.2012 22:00:00\""
Результат : Методы для типа 'DateTime?'недоступны
"BirthDate.Value.ToString() = \"16.2.2012 22:00:00\""
Результат : LINQ to Entities не распознает метод метода System.String ToString (), и этот метод не может быть переведенв выражение магазина.
"BirthDate == null ? 1=1 : (DateTime)BirthDate.ToString() = \"16.2.2012 22:00:00\""
Результат : '.'или '(' ожидается
Есть идеи, как решить проблему?
Обновление (добавлен дополнительный исходный код о генерации запроса)
var filterQueries = query.GridFilteringOptions.filters
// remove filters that doesn't have all the required information
.Where(o => o.name != string.Empty && o.value != string.Empty && !string.IsNullOrEmpty(o.type))
// remove filters that are filtering other tables than current
.Where(o => o.table == tableName)
.Select(filter => filter.ResolveQuery()).ToList();
if (filterQuery.Any())
{
var filterQuery = string.Join(" And ", filterQueries);
rows = rows.Where(filterQuery);
}
А вот класс Filter и методы, связанные с этим контекстом
public string ResolveQuery()
{
if (type == "Int64")
{
return ResolveInteger();
}
else if(type == "String")
{
return ResolveString();
}
else if(type == "DateTime")
{
return ResolveDateTime();
}
else
{
return string.Empty;
}
}
private string ResolveDateTime()
{
DateTime result = new DateTime();
if (DateTime.TryParse(this.value, out result))
{
return string.Format("{0}.ToString() = \"{1}\"", this.name, result.ToUniversalTime());
}
return string.Empty;
}
private string ResolveString()
{
switch (@operator)
{
default:
return string.Format(@"{0}.StartsWith(""{1}"")", this.name, this.value);
}
}
private string ResolveInteger()
{
string tmp = this.name;
switch (@operator)
{
case -1:
return string.Empty;
case 0:
tmp += "<";
break;
case 1:
tmp += "=";
break;
case 2:
tmp += ">";
break;
default:
return string.Empty;
}
tmp += value;
return tmp;
}