【发布时间】:2011-07-25 13:00:18
【问题描述】:
我正在使用 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);
【问题讨论】:
-
您是否在自己的线程上运行此查询并使用回调来获取结果?
-
@Hamid,您使用的是什么 ORM?实体框架? LINQ 到 SQL?这两者都会生成看起来像您的“旧逻辑”的智能 TSQL,除非采取措施防止它发生,例如从
IQueryable强制转换为IEnumerable或ToList()。 -
@Hamid,如果可能,请启动 SQL Profiler,这样您就可以查看服务器上实际运行的查询。这将教你很多关于 LINQ、EF 的知识,并允许你进行调优。
标签: c# asp.net asp.net-mvc linq asp.net-mvc-3