Я когда-то бил головой об этой проблеме. Есть несколько подобных случаев, но решения не применимы к моему делу.Динамический LINQ (для сущностей) Где с нулевым столбцом DateTime
У меня есть метод, который возвращает запрос фильтра в строчном формате. Метод имеет логику для различных типов данных, устанавливает правильные значения, имена столбцов и т.д.
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 к Entities не распознает «) (System.String ToString» МЕТОДЫ, и этот метод не может быть переведен в выражение магазина.
"BirthDate == null ? 1=1 : (DateTime)BirthDate.ToString() = \"16.2.2012 22:00:00\""
Результат: '' или «(» ожидается
Любые идеи, как решить эту проблему?
Update (более исходный код добавляется о генерации запросов)
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);
}
А вот класс фильтра и методы связанные с этим контекстом
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;
}
BirthDate.ToString() - Что такое BirthDate в этом контексте? В моем случае это просто имя столбца, поэтому оно не существует в контексте кода. – Tx3
Я вижу. Посмотрите мой обновленный ответ. –
Спасибо, я попробую непроверенный подход также – Tx3