我一直在這個問題上撞了一段時間。有一些類似的情況,但解決方案不適用於我的案件。動態LINQ(對實體)哪裏可以爲空的DateTime列
我有一個返回字符串格式的過濾器查詢的方法。該方法具有對不同的數據類型的邏輯,設置正確的值,列名等
string filterQuery = GetFilterQuery(params);
rows = rows.Where(filterQuery);
我的問題是我在數據庫Nullable DateTime
和我在代碼側String
表示。
我曾嘗試以下查詢(String
表示可能是錯誤的目前):
"BirthDate.ToString() = \"16.2.2012 22:00:00\""
結果: '日期時間' 方法對類型不可訪問
"BirthDate.Value.ToString() = \"16.2.2012 22:00:00\""
結果:LINQ實體無法識別方法「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);
}
,這裏是一個類過濾器和方法與此背景有關
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 2012-02-14 09:22:43
我明白了。看看我更新的答案。 – 2012-02-14 09:34:36
謝謝,我會嘗試未經測試的方法 – Tx3 2012-02-14 09:44:04