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 从包含大量列的表中选择一些列,以便更好更快地查询的主要内容,如果未能解决你的问题,请参考以下文章