【问题标题】:Sort by New Guid for random order按新指南排序以获取随机顺序
【发布时间】:2014-01-06 15:17:26
【问题描述】:

为了从 Sql 查询中获得随机顺序的结果,我通常按新的 Guid 排序。我以前用 Entity-Framework 做过这个,但是由于某种原因它现在不起作用。

例如(使用 Adventureworks2008r2 数据库)我在 LinqPad 中运行以下查询:

(from t in Employees
 orderby Guid.NewGuid()
 select new {t.Person.FirstName,t.Person.LastName,t.JobTitle})

这会生成以下 SQL:

SELECT [t1].[FirstName], [t1].[LastName], [t0].[JobTitle]
FROM [HumanResources].[Employee] AS [t0]
INNER JOIN [Person].[Person] AS [t1] ON
   [t1].[BusinessEntityID] = [t0].[BusinessEntityID]

那么我的 orderby 查询发生了什么?

我通过以下查询更进一步,发现Guid.NewGuid() 只被调用一次。

(from r in (from t in Employees
 select new {t.Person.FirstName,t.Person.LastName,t.JobTitle,
    g = Guid.NewGuid()})
 orderby r.g
 select r)

这会生成以下 SQL 查询

-- Region Parameters
DECLARE @p0 UniqueIdentifier = '68ad5016-19ca-4e31-85c3-1d45618ea8c9'
-- EndRegion
SELECT [t2].[FirstName], [t2].[LastName], [t2].[JobTitle]
FROM (
    SELECT [t1].[FirstName], [t1].[LastName], [t0].[JobTitle], @p0 AS [value]
    FROM [HumanResources].[Employee] AS [t0]
    INNER JOIN [Person].[Person] AS [t1] ON
  [t1].[BusinessEntityID] = [t0].[BusinessEntityID]
    ) AS [t2]
ORDER BY [t2].[value]

知道发生了什么吗?

【问题讨论】:

标签: sql linq entity-framework linqpad


【解决方案1】:

我相信问题是由 LinqPad 在您直接查询数据库时创建 DBContext(或它在内部执行的任何操作)的方式引起的(而不是创建您自己的 EF 连接)。如果我运行这个:

using (var context = new MyContext()) {

    var query =
    from x in context.MyTable
    select new {
        x.ID,
        g = Guid.NewGuid()
    };

} 

我得到以下 SQL

SELECT 
[Extent1].[ID] AS [ID], 
NEWID() AS [C1]
FROM [dbo].[MyTable] AS [Extent1]

这会为每一行生成一个唯一的 guid。您可以将 Linq 更改为 orderby Guid.NewGuid(),您将获得所需的随机排序。

var query =
    from x in context.MyTable
    orderby Guid.NewGuid()
    select new {
        x.ID
    };

【讨论】:

  • 绝对不一样。您正在返回 guid,他按 guid 订购,但不返回。
猜你喜欢
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 2011-06-18
  • 2022-11-18
  • 2017-05-12
相关资源
最近更新 更多