加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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对象,我的所有排序和过滤逻辑都在其上完成.

这是我想到的:
如果我不做任何过滤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的代码中,您尚未向我们展示.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读