LINQ to NHibernate - 将guid与string进行比较

时间:2012-07-04 12:59:24

标签: linq nhibernate linq-to-nhibernate

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

此行将导致“ToString is not supported exception”。

目标:创建将string,int,GU​​ID与string关键字进行比较的搜索查询。

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

尚未测试,但您可以尝试在查询之前构建您要搜索的Guid对象:

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)

答案 1 :(得分: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))

答案 2 :(得分:0)

更好的比较方法

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

注意:这里我将searchkey视为字符串anc转换版本.Id guid in string并使用String.Compare字符串和忽略大小写的字符串,通过在比较方法中加上

答案 3 :(得分: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 ;-)