我正在研究我的应用程序的速度优化,我发现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));
从理论上讲,它应该创建一个sql语句,它需要25条记录但是分析器会在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)就可以了.但每当我做过滤时,一些东西都搞砸了.这是我的一个过滤器的代码:
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,LevelName = l.LevelName,ViewID = l.ViewID,projectName = l.projectName,StatusID = l.StatusID,StatusName = l.StatusName }) .AsQueryable();
它没有任何限制.如何使这个LINQ-EF产生一些好的sql呢?
Thx提前!
解决方法
你没有说_DatabaseView是什么,但根据你的结果我的猜测是它不是一个ObjectQuery< T>.这可以解释你的问题. ObjectQuery将转换为sql; IEnumerable< T> .Skip()不会.在可枚举上调用AsQueryable()不足以实现这一点.
例如,这个:
var foo = MyObjectContext.someEntitySet.AsEnumerable().AsQueryable().Take(10);
…不会把TOP放在sql中.
但是这个:
var bar = MyObjectContext.someEntitySet.Take(10);
……会的.
再一次:你还没有说_DatabaseView是什么.直接在ObjectContext上尝试此操作,您将看到它的工作原理.该错误位于用于分配_DatabaseView的代码中,您尚未向我们展示.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。