c# - 从巨大的数据库表中读取

标签 c# asp.net asp.net-mvc linq asp.net-mvc-3

我正在使用 LINQ 访问我的数据库表。一些表可能有(数十万)条记录。

使用如下语句从表中读取:

var records = db.Logs;

会使应用程序非常非常慢。它将一次加载所有记录。

我需要使用多个条件来过滤结果,例如:

if (UserID != null)
{
    records = records.Where(r => r.User == UserID);
}

if (UserIP != null)
{
    records = records.Where(r => r.IP   == UserIP);
}

问题是我第一次从表中读取会给我带来所有记录,这会使应用程序非常慢。

有没有办法像我们以前使用 SQL 语句那样在 LINQ 语句(if、switch)中创建条件?

这是过去创建逻辑的方式:

string sql = "SELECT * FROM Log WHERE 1=1";
if (UserID != null)
{
    sql += " AND User = '" + UserID + "'";
}

if (UserIP != null)
{
    sql += " AND IP = '" + UserIP + "'";
}

sqlCmd.query(sql);

最佳答案

实际上是这样的作业:

  var records = db.Logs;

不立即执行查询。它只准备一个数据结构供以后使用。查询的执行仅在代码需要数据时发生,任何 where 子句都集成在查询中,防止它返回整个表。

完全有可能做这样的事情:

  var records = db.Logs;

  if (filter1) records = records.Where(r => r.Field1 == condition1);
  if (filter2) records = records.Where(r => r.Field2 == condition2);

这将以使用一种(某种)动态 where 语句执行一个查询结束。

但是您应该定义正确的索引。

关于c# - 从巨大的数据库表中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6816512/

相关文章:

c# - 从 FileResult 重定向到 MVC ActionResult

asp.net-mvc - EntityFramework-连接字符串在哪里?

c# - 类型或命名空间名称不存在

c# - 如何使用 XPathNodeIterator 检索值

asp.net - 使用母版页时,如何将特定 NAME 分配给标签?

javascript - 如何使用 JavaScript 计算 GridView 列的总和?

c# - 使用反射在嵌套对象中设置属性

c# - Unity C# Player 使用 Rigidbody2D.AddForce 速度太快

c# - C# 和 .net 中的僵尸对象它们是什么以及如何避免它们

asp.net - 在 asp .net MVC 中查看数据 - 未设置对象引用