Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ to SQL中的Guid类型和(';>;';大于比较)_C#_Asp.net_.net_Linq To Sql - Fatal编程技术网

C# LINQ to SQL中的Guid类型和(';>;';大于比较)

C# LINQ to SQL中的Guid类型和(';>;';大于比较),c#,asp.net,.net,linq-to-sql,C#,Asp.net,.net,Linq To Sql,请帮帮我。 我尝试比较.Where()查询方法中的两个guid。但我得到了编译错误。 错误1运算符“>”不能应用于“System.Guid”和“System.Guid”类型的操作数 Guid startUser = ////Here I get user by url id param List<Friends> friends = Common.DataContext.Friends.Where(u => u.FriendID > startUser).Take(5);

请帮帮我。 我尝试比较.Where()查询方法中的两个guid。但我得到了编译错误。 错误1运算符“>”不能应用于“System.Guid”和“System.Guid”类型的操作数

Guid startUser = ////Here I get user by url id param
List<Friends> friends = Common.DataContext.Friends.Where(u => u.FriendID > startUser).Take(5);
Guid startUser=///这里我通过url id参数获取用户
List friends=Common.DataContext.friends.Where(u=>u.friendsid>startUser);
和:

u.FriendID.CompareTo(startUser) > 0

对Guid应用大于或小于是没有意义的

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

两个guid,但哪个更大?是否删除-并计算十六进制的总数?或者在-之间添加十六进制的总和

它只是没有完成(尽管它可以)

不过,应用逻辑==和!=是有意义的。Guid结构确实会重载==和!=运算符,因此使用它们,您还可以轻松比较字符串值,即


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

我知道这是一个老问题,但我以前见过这个数据案例,它可能与将来的某个人有关。 当您出于某种原因将表(物理组织,默认为主键)聚集在一个唯一标识符上时,这可能与此相关。如果您需要批量读取或分页该表,则可以使用以下SQL查询:

SELECT TOP (@batchsize)
    *
FROM myTable
WHERE UserId > @previousBatchUserId
这通常不是一个非常优化的设计,正如您所观察到的,不能使用LINQ to SQL。此外,如果在添加更多行之后执行相同的查询,批中的内容也会发生变化。如果您有一个CreatedDate(时间)相反,按该列排序会更好。或者使用created date列作为第一个条件,然后对GUID进行!=检查(如果可以使用相同的戳记创建多个)。 理想情况下,您应该添加一个代理标识列(及其上的集群),然后可以在该ID大于所需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);
Guid startUser=//一些Guid
int startUserId=Common.DataContext.Friends.Single(u=>u.FriendID==startUser.Id;
List friends=Common.DataContext.friends.Where(u=>u.Id>startUserId);

你为什么还要尝试比较GUID?!到目前为止,你描述的是一个问题,但你没有提出任何问题。这是一个问答网站;如果你提出问题,你会得到更好的结果。GUID不打算被订购,所以你得到一个错误的事实是好的。GUI只打算为标识进行比较。这就是您试图基于GUID进行订购是一个红色标志,表明您可能滥用了GUID的使用。请后退一步,询问您是否真的想要订购。我关于使用GUID的正确方法和错误方法的系列文章从这里开始:它可能会帮助您。@EricLippert:GUID不是有意订购的,可能是这样,但是struct仍然以某种有趣的方式实现了
IComparable
(字典式,与
Guid.ToString()中的字节顺序相同),我知道这一点,因为我见过人们使用
SortedDictionary
…我在NHibernate中也有同样的问题。这样做是有充分理由的。这是基于id的分页的常见模式。而不是使用row_number()>带有“TOP n”的过去行,您可以获取下n行,这些行的id大于上一页的最后一个id。这是更有效的,特别是对许多人的最后一页。在我的例子中,我正在对整个表进行分页以构建搜索索引。我按照GUID的顺序去做,因为它是聚集索引,顺序并不重要。TSQL允许在查询中进行比较!我们只需要一种用LINQ写的方法。另外。。。guid往往是系统生成的,没有明确的序列,因此除非出于某种原因生成顺序guid,否则说>或<有什么意义?一个大于或小于另一个又有什么关系呢?
Guid
struct确实重载了
==
=运算符,所以使用它们。如果使用
Equals(…)
,请不要将字符串引用与(装箱的)
Guid
值进行比较;它们永远不会相等。@PaulSullivan不管它们以什么顺序生成,我都会读取搜索索引的所有行,我只需要一种有效的方法将它们拆分为页面。您关于重载>运算符的评论没有意义。我们在这里讨论的是Linq到SQL和NHibernate。查询不是在代码中运行,而是在数据库中运行。所以这不是关于我的方法,而是关于DB将做什么。此外,仅仅因为你可以在.NET中编写一些代码并不意味着Linq to SQL可以解决如何将其转换为SQL查询。此外,@PaulSullivan I不能“simpy重载>运算符”,因为C#不允许你重载现有类型的运算符。如果我在某个类中编写公共静态bool运算符>=(Guid a,Guid b){…},它会抱怨“二进制运算符的参数之一必须是包含类型”Guid在SQL Server中存储为16字节的值。您可以在SQL Server中比较它们。如果你想要某种秩序,这是有道理的。但是关于如何在Linq和EF中比较它们,我不知道怎么做。这很可能在“Linq到SQL”中不起作用,我知道它在NHibernate中不起作用。仅仅因为to在代码中运行并不意味着它知道如何将其转换为数据库查询。类似问题: