2016-09-08 5 views
4

私は、数十万の列を持つ生徒のテーブルがあるとします。私はOrderBy、Select、およびWhere句の順序が問題になるかどうかを確認する

SELECT id,lastname,firstname 
FROM students 
WHERE coursename='Eurasian Nomads' 
ORDER BY lastname,firstname 

のEFと同等にしたい私は

public class StudentView{ 
    public int ID{get;set;} 
    public string LastName{get;set;} 
    public string FirstName{get;set;} 
} 

ビューモデルを作り、このEFコードが動作しているようですので、私はちょうどフルStudentモデルのサブセットをしたい:

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(); 
+0

誰かに本物の答えを投稿させてもらいますが、すべてのメソッドが 'IQueryable'オブジェクトを返すので順序は重要ではなく、クエリの実行は実際には可能な最後の時点まで延期されますあなたが 'ToList'のとき – Louis

+2

SQLサーバーを使用している場合は、SQLプロファイラを使用して、各バリエーションがどのSQLクエリを生成し、どのSQLクエリに時間がかかるかを確認できます。私が推測しなければならないのは、彼らは同じだと言うでしょう。 –

+3

'Select'は' IQueryable'型をあるフォームから別のフォームに変更するので重要です。 'OrderBy'と' Where'は重要ではありません。 – Max

答えて

3

順序は、ほとんどの場合には関係ありません。

実際に、利点の1つは、where、order by、およびother句を連結してクエリを徐々に作成できることです。

しかし、注文が生成されるSQLに影響を及ぼす場合があります。

提供したサンプルを用意してください。どちらも正しくコンパイルされますが、2番目のコンパイルは実際には実行されません。あなたはEFデータベースに対してこのクエリを実行しようとする場合は、非サポート例外取得します:

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 

、あなたは順序が時々重要である見ることができるように。

+1

これは素晴らしい説明です。 'NotSupportedException'は、' Select'が 'Student'クエリーではなく' StudentView'クエリーになり、 'StudentView'に' CourseName'のプロパティが含まれていないためです。 – Max

+1

確かに@Max。それは私が "ここで重要なのは、ビューモデルのCourseNameプロパティでクエリをフィルタリングしようとしているということですが、あなたの説明が確かに有効だと言いました。ありがとう。 –

関連する問題