return queryable.Where(version => version.Id.ToString().Contains(searchKey));
この行により、「ToString はサポートされていない例外」が発生します。
目標: 文字列、int、GUID を文字列キーワードと比較する検索クエリを作成します。
助けてくれてありがとう。
return queryable.Where(version => version.Id.ToString().Contains(searchKey));
この行により、「ToString はサポートされていない例外」が発生します。
目標: 文字列、int、GUID を文字列キーワードと比較する検索クエリを作成します。
助けてくれてありがとう。
テストしていませんが、クエリの前に Guid-to-be-searched オブジェクトを作成してみてください。
Guid searchGuid;
try
{
searchGuid = Guid.Parse(searchKey);
}
catch (System.FormatException)
{
// Handle invalid search key
}
return queryable.Where(version => version.Id == searchGuid);
編集:
テストしていませんが (申し訳ありませんが、もう一度)、私の知る限り、NHibernate.Linq は型変換ステートメントを同等の SQL Cast 関数に変換できます。多分これはうまくいくはずです:
return queryable.Where(version => (string)version.Id == searchGuid);
ただし、C#のシンタックスについてはわかりません。VB.NET では、次のように記述します。
Return queryable.Where(Function(version) CType(version.Id,String) = searchGuid)
LINQを使用して直接実行することはできません(LINQプロバイダーを拡張する必要がありますが、これは重要です)
ただし、NHibernateが持つ他のすべてのクエリメソッドを使用すると簡単に実行できます。
QueryOverの例を次に示します。
return session.QueryOver<YourEntity>()
.Where(Restrictions.Like(
Projections.Cast(NHibernateUtil.String,
Projections.Property<YourEntity>(
version => version.Id)),
searchKey,
MatchMode.Anywhere))
このように比較するより良い方法
return queryable.
Where(version =>
(String.Compare(version.Id.ToString(),searchkey, true)==0);
注 :ここでは、searchkey を文字列 anc 変換 version.Id guid と文字列で使用し、String.Compare の両方を使用し、比較メソッドに true を入力して文字列の大文字と小文字を区別しないと考えています。
少なくともフレームワーク4.5の答えは次のとおりです...
Version Ver = null;
foreach (Version V in Versions) {
Guid g = V.ID;
if (string.Compare(g.Value.ToString(), searchkey)) {
Ver = V;
break;
}
}
OR in LINQ
Version Ver = Version.Where(v => v.ID.Value.ToString == searchkey).FirstOrDefault;
//Use found Ver ;-)