c# – LINQ或Entity Framework创建无界的SQL语句
发布时间:2020-12-16 01:38:54 所属栏目:百科 来源:网络整理
导读:我正在研究我的应用程序的速度优化,我发现LINQ(或EF)正在为我创建一些工作缓慢的奇怪SQL. 这是一些代码: SomeList.AddRange(_databaseView .Select(l= new SomeViewModel { Date = l.Date,Details = l.Details,Level = l.LevelName,Id = l.ViewID,Message =
我正在研究我的应用程序的速度优化,我发现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对象,我的所有排序和过滤逻辑都在其上完成. 这是我想到的: 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的代码中,您尚未向我们展示. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |