LINQ to NHibernate - 比较 GUID 和字符串

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

这行代码会导致“不支持ToString异常”。

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

感谢任何帮助。


嗨,我更新了我的答案,请检查它是否对你有帮助。我写了一些注释,可能会帮助你理解它的工作原理... - Pranay Rana
4个回答

3
尚未测试,但您可以尝试在查询之前构建要搜索的Guid对象:
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)

是的,这是我的备选方案,因为GUID类型只有一种情况。 - Ievgen Martynov
不支持“编辑”。System.String ToString(System.Object) - Ievgen Martynov
-1 即使提到“备选计划”也要避免,因为这样会严重影响索引。这是最糟糕的错误类型,请务必删除。 - Aron

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))

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 ;-)

0
更好的比较方式是这样的。
return queryable.
     Where(version => 
                 (String.Compare(version.Id.ToString(),searchkey, true)==0);

注意:在这里,我将searchkey视为字符串,并将version.Id转换为字符串,使用String.Compare比较两个字符串并忽略大小写,通过在比较方法中设置true。


ToString() 不被支持,而 Equals() 似乎也是如此。 - Ievgen Martynov
System.NotSupportedException {"Int32 Compare(System.String, System.String, System.StringComparison)"} - Ievgen Martynov
是的,我注意到了 - 不支持 :) - Ievgen Martynov
@YevhenMartynov - 你在那里遇到的错误是什么? - Pranay Rana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接