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);
编辑:
尚未测试(对不起,再次),但 afaik NHibernate.Linq 能够将类型转换语句转换为等效的 SQL Cast 函数。也许这应该工作:
return queryable.Where(version => (string)version.Id == searchGuid);
不过,我不确定 C# sintax。在 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 ;-)