微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – LINQ或Entity Framework创建无界的SQL语句

我正在研究我的应用程序的速度优化,我发现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 举报,一经查实,本站将立刻删除。

相关推荐