私は自分のアプリケーションの速度の最適化に取り組んでいますが、LINQ (または EF) が動作の遅い奇妙な SQL を作成していることを発見しました。
ここにいくつかのコードがあります:
SomeList.AddRange(_databaseView
.Select(l=> new SomeViewModel
{
Date = l.Date,
Details = l.Details,
Level = l.LevelName,
Id = l.ViewID,
Message = l.Message,
ProjectName = l.projectName,
StatusId = l.StatusID,
StatusName = l.StatusName
})
.Skip(50)
.Take(25));
理論的には、25 レコードを取る SQL ステートメントを作成する必要がありましたが、プロファイラーは次の SQL を表示します。
SELECT [Extent1].[Date] AS [Date],
[Extent1].[ID] AS [ID],
[Extent1].[LevelID] AS [LevelID],
[Extent1].[StatusID] AS [StatusID],
[Extent1].[projectName] AS [projectName],
[Extent1].[LevelName] AS [LevelName],
[Extent1].[StatusName] AS [StatusName],
[Extent1].[Message] AS [Message],
[Extent1].[Details] AS [Details],
[Extent1].[LogViewID] AS [LogViewID]
FROM (SELECT [v_MyView].[Date] AS [Date],
[v_MyView].[ProjectID] AS [ProjectID],
[v_MyView].[LevelID] AS [LevelID],
[v_MyView].[StatusID] AS [StatusID],
[v_MyView].[projectName] AS [projectName],
[v_MyView].[LevelName] AS [LevelName],
[v_MyView].[StatusName] AS [StatusName],
[v_MyView].[Message] AS [Message],
[v_MyView].[Details] AS [Details],
[v_MyView].[ViewID] AS [ID]
FROM [dbo].[v_MyView] AS [v_MyView]) AS [Extent1]
_databaseView は、並べ替えとフィルター処理のすべてのロジックが実行される IQueryable オブジェクトです。
ここに私が考え出したことがあります:フィルタリングを行わない場合、SQLはSELECT TOP(25)で正常です。しかし、フィルタリングを行うたびに、何かが台無しになります。これが私のフィルターの1つのコードです:
if (Filters.ProjectName != null && Filters.ProjectName[0] != 0) // check if "all" is not checked
_databaseView = Filters.ProjectName
.Join(_databaseView, f => f, l => l.ProjectID, (f,l) => new SomeViewModel
{
Date = l.Date,
Details = l.Details,
LevelName = l.LevelName,
ViewID = l.ViewID,
Message = l.Message,
projectName = l.projectName,
StatusID = l.StatusID,
StatusName = l.StatusName
})
.AsQueryable();
そして、それは何の制約もありません。この LINQ-EF を作成して、適切な SQL を生成するにはどうすればよいですか?
事前にthx!