gpt4 book ai didi

c# - Dynamic LINQ (to entities) Where with nullable DateTime column

转载 作者:太空狗 更新时间:2023-10-29 23:40:56 29 4
gpt4 key购买 nike

一段时间以来,我一直在努力解决这个问题。有一些类似的案例,但解决方案不适用于我的案例。

我有一个以字符串格式返回过滤器查询的方法。该方法具有针对不同数据类型的逻辑,设置正确的值、列名等。

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;
}

最佳答案

LINQ to Entities 无法识别 ToString() 方法。在将结果字符串插入查询之前,您必须对其进行评估。

要在您的问题中创建示例,您可以这样处理:

// "BirthDate.ToString() = \"16.2.2012 22:00:00\""
string birthdate = BirthDate.ToString();
string query = String.Format("{0} = \"16.2.2012 22:00:00\"", birthdate);

// "BirthDate.Value.ToString() = \"16.2.2012 22:00:00\""
string birthdate = BirthDate.Value.ToString();
string query = String.Format("{0} = \"16.2.2012 22:00:00\"", birthdate);

"BirthDate == null ? 1=1 : (DateTime)BirthDate.ToString() =\"16.2.2012 22:00:00\"" 可能不起作用,因为 LINQ to EF 无法识别三元运算符 ( ? : )

编辑:我从您的评论中了解到,BirthDate 是您表中的一列,而不是变量。在这种情况下,您可以检索所有条目,将它们转换为列表,然后像这样使用 LINQ to Objects 应用过滤器(尽管您必须相应地修改您的 filterQuery):

string filterQuery = GetFilterQuery(params);
var filteredRows = rows.ToList().Where(filterQuery);

未测试:可能会使用您数据库的 CONVERT功能:

string query = "CONVERT(varchar(20), BirthDate) = \"16.2.2012 22:00:00\"";

关于c# - Dynamic LINQ (to entities) Where with nullable DateTime column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9273991/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com