私はいつかこの問題に頭を悩ましています。いくつかの同様のケースがありますが、解決策は私の場合には適用されませんでした。動的LINQ(エンティティへの)null可能なDateTime列のある場所
フィルタクエリを文字列形式で返すメソッドがあります。この方法は、異なるデータタイプのロジック、正しい値を設定し、列名など
string filterQuery = GetFilterQuery(params);
rows = rows.Where(filterQuery);
を有する私の問題は、私は、データベース内Nullable DateTime
を有し、Iはコード側でString
表現を有することです。
私が試してみました次のクエリは、(String
表現が間違っている現在、かもしれません):
"BirthDate.ToString() = \"16.2.2012 22:00:00\""
結果: '?のDateTime' メソッドタイプにエンティティへのLINQは方法「可能System.StringのToString()」メソッドを認識しない、そしてこの方法は、ストア式に変換することができません:アクセス
"BirthDate.Value.ToString() = \"16.2.2012 22:00:00\""
結果されていません。
"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
私は参照してください。私の更新された答えを見てください。 –
ありがとう、私はまた、 – Tx3