Linq-to-entities中的OrderBy、Select和Where子句的顺序重要吗?
本文关键字:顺序 子句 Where OrderBy 中的 Select Linq-to-entities | 更新日期: 2023-09-27 18:06:10
假设我有一个包含大量列的学生表。我想要等效于
的EFSELECT id,lastname,firstname
FROM students
WHERE coursename='Eurasian Nomads'
ORDER BY lastname,firstname
我只想要一个完整Student
模型的子集所以我创建了一个视图模型
public class StudentView{
public int ID{get;set;}
public string LastName{get;set;}
public string FirstName{get;set;}
}
和这个EF代码似乎可以工作:
List<StudentView> students=context.Students
.Where(s=>s.CourseName=="Eurasian Nomads")
.OrderBy(s=>s.LastName)
.ThenBy(s=>s.FirstName)
.Select(s=>new StudentView(){ID=s.ID,LastName=s.LastName,FirstName=s.FirstName})
.ToList();
但是我的问题是,这些子句的顺序是否重要,如果重要,我应该遵循什么样的规则才能获得最佳性能?
例如:
List<StudentView> students=context.Students
.Select(s=>new StudentView(){ID=s.ID,LastName=s.LastName,FirstName=s.FirstName})
.OrderBy(s=>s.LastName)
.ThenBy(s=>s.FirstName)
.Where(s=>s.CourseName=="Eurasian Nomads")
.ToList();
在对服务器执行查询之前创建查询的顺序在大多数情况下是不相关的。
实际上,它的一个优点是可以通过连接where、order by和其他子句来逐步创建查询。
但是有时顺序会影响生成的sql。
取您提供的样品。它们都能正确编译,但第二个实际上没有执行。如果您尝试对EF数据库运行此查询,您将得到一个NotSupportedException:
System.NotSupportedException: The specified type member 'CourseName' is not supported in LINQ to Entities.
这里的关键是,您正在尝试通过视图模型(StudentView)中的CourseName属性过滤查询,而不是实体的属性。所以你会得到这个错误
对于第一个查询,它正确地生成如下sql:
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[LastName] AS [LastName],
[Extent1].[FirstName] AS [FirstName]
FROM [dbo].[Students] AS [Extent1]
WHERE N'Eurasian Nomads' = [Extent1].[CourseName]
ORDER BY [Extent1].[LastName] ASC, [Extent1].[FirstName] ASC
所以,正如你所看到的,顺序有时很重要