Linq 是否可以根据参数更改条件

Linq 是否可以根据参数更改条件,linq,linq-to-sql,Linq,Linq To Sql,我有这个疑问。fromdate和until是参数 List<TimeEntryReportModel> result = ( from u in ctx.TT_Users join pm in ctx.TT_ProjectMembers on u.UserID equals pm.UserID join e in ctx.TT_EntryLogs on pm.UserID equals e.UserID

我有这个疑问。fromdate和until是参数

List<TimeEntryReportModel> result = (
           from u in ctx.TT_Users
           join pm in ctx.TT_ProjectMembers on u.UserID equals pm.UserID
           join e in ctx.TT_EntryLogs on pm.UserID equals e.UserID
           join p in ctx.TT_Projects on e.ProjectID equals p.ProjectID
           where e.EntryDate >= fromdate && e.EntryDate <= until.Value && pm.TT_EntryLogs.Sum(q => q.Duration) > 0
           select new TimeEntryReportModel
           {
               UserId = e.UserID,
               DisplayName = u.DisplayName,
               UnitId = u.TT_BusinessUnits.UnitId,
               //select many more property's here that I get from e, p, pm, u etc.
           }
    ).Distinct().OrderBy(n => n.DisplayName).ToList();
另一种方法如下所示:

return result.Where(l => l.UnitId == unitId).ToList();
from u in ctx.TT_Users 
where u.userId >= 1001
    && (myDateParam == null || u.RegisteredOn >= myDateParam);
这非常有效,但由于结果包含大约420个TimeEntryReportModels,在其他方法中,我必须对该结果进行子查询,因此在我实际收到所需数据之前大约需要10秒钟

解决此问题的一种方法是复制并粘贴查询3次,并在每个查询中添加必要的where条件。但这似乎有点离谱,因为我基本上只是为了一个条件重写整个查询。。。我不能根据传递给包含此查询的方法的参数向查询添加条件吗


tl;dr是否可以基于参数向LINQ查询添加条件?

某种程度上,您可以使用逻辑OR来获得相同的效果。例如,假设我有一个日期参数,日期是可选的,查询总是检查id。您可以这样构造Where调用:

return result.Where(l => l.UnitId == unitId).ToList();
from u in ctx.TT_Users 
where u.userId >= 1001
    && (myDateParam == null || u.RegisteredOn >= myDateParam);
如果指定了myDateParam,则where将返回ID大于1001且在指定日期之后注册的所有用户。显然,我的例子是虚构的……这个原理可能会对你有所帮助。如果未指定myDateParam,则返回ID大于1001的所有用户


当然,短路是实现这一点的原因。您也可以使用布尔值和列表等来执行此操作。

在构建变量
result
时使用
.ToList()
函数会导致执行查询。将结果视为
IQueryable
类型的变量,而不是列表,稍后将执行请求(在控制器方法中调用
.ToList()
时)。 所以,你可以写:

IQueryable<TimeEntryReportModel> result = (
...
).Distinct().OrderBy(n => n.DisplayName);

在我看来,延迟执行是LINQ的主要兴趣之一。

当我从方法返回IQueryable时,它会给我一个错误“无法访问已处理的对象”。有没有办法解决这个问题?很明显,这是因为在数据超出花括号时使用(dataClassDataContext ctx=getDb())杀死数据。否则我该怎么做?当我不杀死ctx,并且像dataClassDataContext ctx=getDb()那样做时,它似乎可以工作;但是,在处理完变量之后,如何清理它呢?这是我以前见过的解决方案之一,但我不是在控制器中检索数据,而是在另一个静态类中检索数据,因此我无法重写dispose。在真正处理查询时,DbContext必须处于活动状态(未disposed)。想法:在控制器构造函数中实例化DbContext,并在控制器Dispose方法中使用它。