He estado golpeando mi cabeza con este problema por algún tiempo. Hay algunos casos similares, pero las soluciones no eran aplicables en mi caso.Dynamic LINQ (a entidades) Donde con la columna de fecha y hora anulable
Tengo un método que devuelve consulta de filtro en formato de cadena. El método tiene la lógica para diferentes tipos de datos, establece valores correctos, los nombres de columnas etc.
string filterQuery = GetFilterQuery(params);
rows = rows.Where(filterQuery);
Mi problema es que tengo Nullable DateTime
en la base de datos y tengo String
representación en el lado del código.
he tratado siguientes consultas (String
representación podrían estar equivocados actualmente):
"BirthDate.ToString() = \"16.2.2012 22:00:00\""
Resultado: '? DateTime' Métodos del tipo de no son accesibles
"BirthDate.Value.ToString() = \"16.2.2012 22:00:00\""
Resultado: LINQ a Entidades no reconoce el método de método 'System.String ToString()', y este método no se puede traducir en una expresión tienda.
"BirthDate == null ? 1=1 : (DateTime)BirthDate.ToString() = \"16.2.2012 22:00:00\""
Resultado: ''. o '(' espera
Alguna idea de cómo resolver el problema?
actualización (más código fuente añadió sobre la generación de consultas)
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);
}
Y aquí es un filtro de clase y métodos se en relación con este contexto
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() - ¿Qué es BirthDate en este contexto? En mi caso, es solo un nombre de columna, por lo que no existe en el contexto del código. – Tx3
Ya veo. Eche un vistazo a mi respuesta actualizada. –
Gracias, probaré el enfoque no probado también – Tx3