Linq MVC5 MSQL 从包含大量列的表中选择一些列,以便更好更快地查询

Posted

技术标签:

【中文标题】Linq MVC5 MSQL 从包含大量列的表中选择一些列,以便更好更快地查询【英文标题】:Linq MVC5 MSQL select some columns from a table containing larg amount of columns in order to make better and fast query 【发布时间】:2021-06-20 01:36:45 【问题描述】:

例如一个包含大约 30 列的表格

table1col1,col2,col3,col4,col5,col6....,col30

在这里我们可以做类似的事情

        List<table1> result = (from a in dbconn.table1.AsEnumerable()

                                        select new table1
                                        
                                            col1= a.col1,
                                            col2= a.col2
                                        ).ToList();
        return result.ToList();

 SELECT 
[Extent1].[col1] AS [col1], 
[Extent1].[col2] AS [col2],
[Extent1].[col3] AS [col3], 
....
....
....
[Extent1].[col30] AS [col30], 
FROM [dbo].[table1] AS [Extent1]

-> 差不多 2 分钟

但这是不正确的,因为这样做时我正在检查 SQL Server Profiler 中的结果,此 linq 查询的结果正在获取所有表 table1 数据然后转储到新的 table1,这很耗时。

现在这使得查询非常慢,因为存在大量数据,所以在 sql 中我们可以只是

select col1,col2 from table1 

-> 差不多 2 秒

我们如何在 linq 中做到这一点而不获取完整的表并使 linq 与 SQL 相同或接近。

【问题讨论】:

为什么是AsEnumerable() @Serg 因为我需要 Enum 中的结果,你也可以使用 Array,但我的情况是 list 我猜你不需要在 LINQ 查询中这样做 @Serg,我不会对性能产生影响,但我这样做是因为我的视图在列表中,所以我无法使用数组。 【参考方案1】:

AsEnumerable() 实际上是对 IEnumerable 的强制转换,这使得成员解析找到 Enumerable 的成员而不是 Queryable。当您想强制查询的一部分以 SQL(或类似的方式)运行,而其余部分使用 LINQ to Objects 运行时,通常会使用它。

(from a in dbconn.table1
     select new
     
         col1= a.col1,
         col2= a.col2
     ).ToList();

另外,检查索引 - 会加快速度

【讨论】:

【参考方案2】:

使用 LINQ to SQL 时要记住的第一条规则是:

调用.ToList()、.ToArray().ToDictionary().AsIEnumerable() 执行查询具体化,这意味着您的IQueryable 将被转换为SQL 与所有.Where().Select().Order() 等.) 谓词在它之前并将被执行。

在您的示例中,您直接在 DbSet 上调用了 .AsEnumerable(),这意味着您将执行不带任何谓词或限制的查询,并且该数据库表中的所有数据都将被推送到内存中,然后您的 .Where() 和 @987654331 @ 将被应用,就在内存中

【讨论】:

以上是关于Linq MVC5 MSQL 从包含大量列的表中选择一些列,以便更好更快地查询的主要内容,如果未能解决你的问题,请参考以下文章

Linq - 从日期时间中选择日期

使用linq在mvc5中按外键表分组表

如何从包含日期时间列的表中获取某些行和“先前”行?

从使用 LINQ 的 ID 引用的表中获取记录名称

如何从sql server中的表中查询json数组类型列的值?

如何从 SqlDataReader 获取列的表名