2013-01-13 65 views
3

请帮助我。 我尝试在.Where()查询方法中比较两个guid。但我得到编译错误。 错误1操作 '>' 不能被施加到型 “的System.Guid” 的操作数和“的System.GuidGUID类型和('>'大于比较)在LINQ to SQL

Guid startUser = ////Here I get user by url id param 
List<Friends> friends = Common.DataContext.Friends.Where(u => u.FriendID > startUser).Take(5); 
+3

为什么你甚至试图比较的GUID? – MarcinJuraszek

+1

到目前为止,您正在描述一个问题,但您并未提出问题。这是一个问答网站;如果你提问*,你会得到更好的结果。 * Guid不打算订购*,所以你得到一个错误的事实是*好*。 Guids仅用于身份对比。你试图基于guid命令是一个红旗,表明你可能会滥用guid。退一步,问这是否真的是你想要订购。 –

+3

我的一系列关于正确和错误使用GUID的文章从这里开始:http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx它可能会帮你。 –

回答

2

并与:

u.FriendID.CompareTo(startUser) > 0 

+0

这很可能不适用于“LINQ to SQL”我知道它不起作用在NHibernate中。仅仅因为在代码中运行并不意味着它知道如何将其转换为数据库查询。 –

-2

一点也没有”不适用于大于或小于Guid。

0f8fad5b-d9cb-469f-a165-70867728950e and 7c9e6679-7425-40de-944b-e07fc1f90ae7

两个Guids但哪个更大?你放弃 - 并计算HEX的总数?或者如何在HEX之间添加 - 的总和?

它只是简单地没有这样做(尽管它可能是)

应用逻辑==和!=但是没有任何意义,但。的GUID结构不超载==和!=操作符,所以使用它们,你也可以很容易地比较两个字符串值,即

var isEqual = guid.ToString().Equals(otherGuid.ToString());

+0

另外... GUID往往是系统生成没有明确的序列,所以除非你是由于某些原因产生序列GUID什么是要说>或<?如果一个比另一个大或小,它有什么关系? –

+0

'Guid'结构会重载'=='和'!='操作符,因此请使用它们。如果你使用'Equals(...)',不要把一个字符串引用与一个(盒装的)'Guid'值进行比较;他们永远不会平等。 –

+0

修改为国家otherGuid是一个字符串(误导),并感谢澄清操作符重载存在于Guid @JeppeStigNielsen –

0

我知道这是一个老问题,但我已经看到了在此之前数据情况,这可能与未来某个人有关。 这可能与您出于某种原因在唯一标识符上聚集您的表(物理组织,带有主键的缺省值)相关。如果您需要批量读取或网页的表格,你可以用阅读SQL查询结束:

SELECT TOP (@batchsize) 
    * 
FROM myTable 
WHERE UserId > @previousBatchUserId 

也就是说,一般不是一个很理想的设计,正如你所观察到不LINQ-工作到SQL。另外,如果在添加更多行后稍后执行相同的查询,批次中的内容将会更改。如果你有一个CreatedDate(time)列,那么排序会好很多。或者使用创建的日期列作为第一个标准,然后对GUID进行检查(如果可以使用相同的邮票创建多个)。 理想情况下,您应该添加一个代理标识列(以及其上的集群),然后您可以在该标识符所在的位置筛选大于与所需GUID相对应的ID。

它可能然后看起来像:

Guid startUser = //some guid 
int startUserId = Common.DataContext.Friends.Single(u => u.FriendID == startUser).Id; 
List<Friends> friends = Common.DataContext.Friends.Where(u => u.Id > startUserId);