我正在使用 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/