我试图建立一个查询界面,用户可以选择任意一组过滤器最终从数据库中获取数据。我遇到的问题是,LINQ到SQL要么不像我期望的那样行事,要么我做错了什么,因为只有第一个有限的WHERE条件是通过SQL传递的。其他过滤的东西似乎正确发生,但从我所知道的情况来看,一旦数据已被提取,就会发生这种情况。LINQ/LINQ到SQL:有没有一种方法可以使用组合的“where”过滤器来生成SQL?
这是我正在尝试做的。
我有一个数据库设置了会话表。我建立了我的LINQ到SQL的映射的东西,我取出过滤掉空注销时间,以及任何额外的过滤器的“活动”会话用户可以指定:
public static IEnumerable<Session> GetSessions(params Func<Session, bool>[] filters)
{
// I've created an auto-generate Linq-to-SQL context object with a Sessions table.
using (DataSourceDataContext ctx = new DataSourceDataContext())
{
// Begin with all "active" sessions
IEnumerable<Session> sessions = ctx.Sessions.Where(x => x.LogoutTime == null);
foreach (var filter in filters)
sessions = sessions.Where(filter);
return sessions.ToArray();
}
}
static void Main(string[] args)
{
Func<Session, bool> mySessions = (x => x.UserName == "steven");
IEnumerable<Session> sessions = GetSessions(mySessions);
}
当我跑这个,我的所得组合是我期待(与用户名=“史蒂芬”,即活动会话),但所请求的有效会话的完整列表从SQL(通过探查):
SELECT [t0].[ID], [t0].[UserName], [t0].[LoginTime], [t0].[LogoutTime], [t0].[Location]
FROM [dbo].[Sessions] AS [t0]
WHERE [t0].[LogoutTime] IS NULL
我下的印象LINQ将继续在幕后构建查询,直到我遍历我的集合,但我无法弄清楚为什么它没有为SQL部分做这件事。我错过了什么,或者我只是想让LINQ-to-SQL做一些它不打算做的事情?
工作非常感谢!你的解释也有帮助,因为我曾经想过IQueryable和IEnumerable之间的区别(我刚刚发现了表达式)。 – Steven 2010-11-23 22:17:41