未提供 OrderBy 或 OrderByDescending 时的 Linq FirstOrDefault 排序?
Linq FirstOrDefault ordering when OrderBy or OrderByDescending are not supplied?
如果我们有一个基本结构为
的EF实体
public class Entity
{
public int Id {get; set;}
public string name {get; set;}
public DateTime lastUpdated {get; set;}
}
以及包含 4 个实体的集合:
entities = new List<Entity>{
new { Id = 0, Name = "Thing One", LastUpdated = new DateTime(2020, 10, 1, 0, 0, 0,)},
new { Id = 1, Name = "Thing One", LastUpdated = new DateTime(2020, 10, 4, 0, 0, 0,)},
new { Id = 2, Name = "Thing One", LastUpdated = new DateTime(2020, 10, 3, 0, 0, 0,)},
new { Id = 3, Name = "Thing One", LastUpdated = new DateTime(2020, 10, 2, 0, 0, 0,)}
};
如果我们使用 Linq 以 select 名称 属性 的 FirstOrDefault
。
var selectedEntity = entities.FirstOrDefault(e => e.Name == "Thing One");
这是要做什么 return?
这导致我正在审查的一段代码出现问题;这将通过仅允许唯一实体并使用 SingleOrDefault
来修复,但我很好奇 FirstOrDefault
在没有 OrderBy
时默认情况下会变成 return条款。
返回符合该条件的第一个条目,如果有多个条目匹配结果为unpredictable/undefined。如果您想确保特定项目,您需要应用 OrderBy
:
var selectedEntity = entities
.Where(e => e.Name == "Thing One")
.OrderByDescending(e => e.LastUpdated)
.FirstOrDefault();
数据库返回的内容取决于供应商。这个相关的问题可能会有所帮助:When no 'Order by' is specified, what order does a query choose for your record set?
如果我们有一个基本结构为
的EF实体public class Entity
{
public int Id {get; set;}
public string name {get; set;}
public DateTime lastUpdated {get; set;}
}
以及包含 4 个实体的集合:
entities = new List<Entity>{
new { Id = 0, Name = "Thing One", LastUpdated = new DateTime(2020, 10, 1, 0, 0, 0,)},
new { Id = 1, Name = "Thing One", LastUpdated = new DateTime(2020, 10, 4, 0, 0, 0,)},
new { Id = 2, Name = "Thing One", LastUpdated = new DateTime(2020, 10, 3, 0, 0, 0,)},
new { Id = 3, Name = "Thing One", LastUpdated = new DateTime(2020, 10, 2, 0, 0, 0,)}
};
如果我们使用 Linq 以 select 名称 属性 的 FirstOrDefault
。
var selectedEntity = entities.FirstOrDefault(e => e.Name == "Thing One");
这是要做什么 return?
这导致我正在审查的一段代码出现问题;这将通过仅允许唯一实体并使用 SingleOrDefault
来修复,但我很好奇 FirstOrDefault
在没有 OrderBy
时默认情况下会变成 return条款。
返回符合该条件的第一个条目,如果有多个条目匹配结果为unpredictable/undefined。如果您想确保特定项目,您需要应用 OrderBy
:
var selectedEntity = entities
.Where(e => e.Name == "Thing One")
.OrderByDescending(e => e.LastUpdated)
.FirstOrDefault();
数据库返回的内容取决于供应商。这个相关的问题可能会有所帮助:When no 'Order by' is specified, what order does a query choose for your record set?