Unable to order by Guid column
See original GitHub issueI’m trying to order by a Guid in EF Core with a relational database and its not ordering. Is there something I’m doing wrong or could this be an issue with EF Core?
Expected: fa1760e7-27f4-4f8b-9205-44acf2358044
But was: c7e76cf2-35d1-4cf8-8a67-83f41842f052
Steps to reproduce
Using NUnit I created the following test
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using NUnit.Framework;
namespace TestName
{
public class BoxDbContext : DbContext
{
public BoxDbContext(
DbContextOptions<BoxDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Box>().HasKey(x => x.Id);
modelBuilder.Entity<Box>().Property(t => t.Id).ValueGeneratedOnAdd();
base.OnModelCreating(modelBuilder);
}
}
public class Box
{
public Guid Id { get; set; }
public Guid SubId { get; set; }
}
[TestFixture]
public class TestClass
{
private SqliteConnection SqliteConnection { get; set; }
private DbContextOptions<BoxDbContext> Options => new DbContextOptionsBuilder<BoxDbContext>()
.UseSqlite(SqliteConnection)
.EnableSensitiveDataLogging()
.Options;
private DbContext GetDbContext()
{
BoxDbContext dbContext = new BoxDbContext(Options);
dbContext.Database.EnsureCreated();
return dbContext;
}
[SetUp]
public void DbSetup()
{
SqliteConnectionStringBuilder sqliteConnectionStringBuilder = new SqliteConnectionStringBuilder
{
Mode = SqliteOpenMode.Memory,
Cache = SqliteCacheMode.Private
};
SqliteConnection = new SqliteConnection(sqliteConnectionStringBuilder.ToString());
SqliteConnection.Open();
}
[TearDown]
public void DbTearDown()
{
SqliteConnection.Close();
}
[Test]
public async Task OrderByGuid()
{
List<Guid> subIds = new List<Guid>
{
Guid.Parse("901CAB07-315F-4594-A5C6-C37725643DB8"),
Guid.Parse("FA1760E7-27F4-4F8B-9205-44ACF2358044"),
Guid.Parse("0C434803-0004-4894-8E29-597AA8BCF8E2"),
Guid.Parse("C7E76CF2-35D1-4CF8-8A67-83F41842F052"),
Guid.Parse("1D6F9038-B5B3-4559-9480-3A2651E52623"),
};
using (DbContext dbContext = GetDbContext())
{
foreach (Guid subId in subIds)
{
dbContext.Set<Box>().Add(new Box {SubId = subId});
}
await dbContext.SaveChangesAsync();
}
IList<Box> boxs;
using (DbContext approvalsDbContext = GetDbContext())
{
boxs = await approvalsDbContext
.Set<Box>()
.OrderByDescending(x => x.SubId)
.ToListAsync();
}
Assert.That(boxs.Count, Is.EqualTo(subIds.Count));
Assert.That(boxs.ToArray()[0].SubId, Is.EqualTo(subIds[1]));
Assert.That(boxs.ToArray()[1].SubId, Is.EqualTo(subIds[3]));
Assert.That(boxs.ToArray()[2].SubId, Is.EqualTo(subIds[0]));
Assert.That(boxs.ToArray()[3].SubId, Is.EqualTo(subIds[4]));
Assert.That(boxs.ToArray()[4].SubId, Is.EqualTo(subIds[2]));
}
}
}
Further technical details
EF Core version: EF core 2.0.0 Database Provider: Microsoft.EntityFrameworkCore.Sqlite Operating system: Windows 10 IDE: Visual Studio 2017
Issue Analytics
- State:
- Created 6 years ago
- Comments:7 (5 by maintainers)
Top Results From Across the Web
How to sort the GUID or Unique identifer column in SQL
I want to sort the newID column by using ORDER BY , but when I try to order by the id is getting...
Read more >Guid Sorting - Transact-SQL
Strangely, in Sql 2012 a uniqueIdentifier column is sorted and the same column in 2017 is not. Though data is different but their ......
Read more >How many ways are there to sort GUIDs? How much time ...
Suppose you want to sort GUIDs, say because they are a key in an ordered map. How many ways are there to order...
Read more >Understanding the GUID data type in SQL Server
GUID is a 16 byte binary SQL Server data type that is globally unique across tables, databases, and servers. The term GUID stands...
Read more >c# - Using a GUID as a Primary Key
Some Ugliness with GUIDs. They are big, 16 bytes each; They are out of order, so you can't sort on ID and hope...
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
@chris31389 Thanks for the info. It does indeed seem that the default ordering for GUIDs on .NET is different from that of SQL Server. No need for another issue–I have added a note to #10265 which is the general issue we have for consideration of this issue.
From the docs:
…and the other docs: