4
return queryable.Where(version => version.Id.ToString().Contains(searchKey));

此行将导致“不支持 ToString 异常”。

目标:创建将字符串、int、GUID 与字符串关键字进行比较的搜索查询。

谢谢你的帮助。

4

4 回答 4

3

尚未测试,但您可以尝试在查询之前构建您的 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)
于 2012-07-04T13:45:46.193 回答
1

您不能直接使用 LINQ 来执行此操作(您必须扩展 LINQ 提供程序,这很重要)

然而,使用 NHibernate 拥有的所有其他查询方法很容易。

以下是 QueryOver 的示例:

return session.QueryOver<YourEntity>()
              .Where(Restrictions.Like(
                         Projections.Cast(NHibernateUtil.String,
                                          Projections.Property<YourEntity>(
                                              version => version.Id)),
                         searchKey,
                         MatchMode.Anywhere))
于 2012-07-07T01:58:41.853 回答
0

像这样比较的更好方法

return queryable.
     Where(version => 
                 (String.Compare(version.Id.ToString(),searchkey, true)==0);

注意:在这里,我考虑将 searchkey 作为字符串 anc 转换 version.Id guid 在字符串中并使用 String.Compare 字符串和忽略字符串中的大小写通过在比较方法中放置 true

于 2012-07-04T13:09:27.273 回答
0

至少这是框架 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 ;-)
于 2015-09-24T03:08:13.933 回答