从HUGE数据库表中读取

Ham*_*mid 3 c# linq asp.net asp.net-mvc asp.net-mvc-3

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

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

var records = db.Logs;
Run Code Online (Sandbox Code Playgroud)

将使应用程序非常慢.它将立即加载所有记录.

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

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

if (UserIP != null)
{
    records = records.Where(r => r.IP   == UserIP);
}
Run Code Online (Sandbox Code Playgroud)

问题是我从表中的第一次读取将带给我所有记录,并将使应用程序非常慢.

有没有办法在LINQ语句中创建条件(if,switch),就像我们以前的SQL语句一样?

这是多久以来创建的逻辑:

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);
Run Code Online (Sandbox Code Playgroud)

GvS*_*GvS 6

实际上是一个如下任务:

  var records = db.Logs;
Run Code Online (Sandbox Code Playgroud)

不立即执行查询.它只准备稍后使用的数据结构.查询的执行仅在代码需要数据时发生,并且任何where子句都集成在查询中,从而阻止它返回整个表.

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

  var records = db.Logs;

  if (filter1) records = records.Where(r => r.Field1 == condition1);
  if (filter2) records = records.Where(r => r.Field2 == condition2);
Run Code Online (Sandbox Code Playgroud)

这将以执行一个查询结束,其中包含(种类)动态where语句.

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