2012-07-04 75 views
4
return queryable.Where(version => version.Id.ToString().Contains(searchKey)); 

此行将导致“ToString不支持异常”。LINQ to NHibernate - 比较guid与字符串

目标:创建搜索查询,将比较字符串,int,GU​​ID和字符串关键字。

感谢您的任何帮助。

+0

您好,我更新了我的答案检查其乐于助人的你或我不写了可能会帮助你如何工作的说明...... –

回答

0

更好的方法来比较类似这样的

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

注:在这里我考虑searchkey作为字符串转换ANC version.Id的GUID字符串,并使用String.Compare字符串和通过把字符串忽略大小写在比较法真正

+0

ToString()不被支持,Equals()似乎也是如此。 –

+0

@YevhenMartynov - 尝试updatea asnwer ... –

+0

System.NotSupportedException { “的Int32比较(System.String,System.String,System.StringComparison)”} –

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转换函数。也许这应该工作:

return queryable.Where(version => (string)version.Id == searchGuid); 

虽然我不确定C#sintax。在VB.NET我会写这样的:

Return queryable.Where(Function(version) CType(version.Id,String) = searchGuid) 
+0

是的,这是我的计划“B”,因为GUID类型只有一种情况。 –

+0

“编辑”也不受支持。 System.String ToString(System.Object) –

+0

-1甚至提到“计划B”。请把它拿出来,因为它应该避免不惜一切代价,因为你将失去索引。这是最糟糕的错误。 – 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 ;-)