0

我用来过滤对象的代码如下:

var dynamicdataentrances = db.DynamicDataEntrances.OrderByDescending(d => d.ID)
                                                  .AsQueryable();
if (TypeID != null)
    dynamicdataentrances = 
        dynamicdataentrances.Where(d => d.DetailPageID == TypeID).AsQueryable();
if (RegionID != null)
    dynamicdataentrances = 
        dynamicdataentrances.Where(d => d.RegionID == RegionID).AsQueryable();
if (ShiftGroupID != null)
    dynamicdataentrances = 
        dynamicdataentrances.Where(d => d.ShiftPlan.ShiftGroupID == ShiftGroupID)
                            .AsQueryable();

它工作没有任何问题。但是,根据“工作流状态”过滤对象不起作用。它的代码如下:

foreach (var wfs in workflowstates)
{
    if (Request[wfs.ID.ToString()] != wfs.ID.ToString())
      dynamicdataentrances = 
        dynamicdataentrances.Where(d => d.WorkflowStateRelation.WorkflowStateID
                                          != wfs.ID).AsQueryable();
}

如您所知,我使用复选框进行过滤;如果未选中 Workflow State 的复选框,我会得到 Workflow State 不等于未选中的对象。我调试了行、foreach 和 if 块是否工作正常,但查询没有相应地工作,它不断获取所有对象。这是一个错误还是我做错了什么?

如果我在工作流状态过滤之前将我的对象集合转换为List ,它可以正常工作。

4

1 回答 1

0

使用List它可以工作,因为对象已经在内存中,并且对于每个未检查状态都排除了不相等的对象。

但是,使用IQueryable对象位于数据库中,并且查询会获取所有对象,因为它们不会在每一步的列表中被排除。

我得到了解决方案:

var unCheckedStates = new List<int>();
foreach (var wfs in workflowstates)
{
    if (Request[wfs.ID.ToString()] != wfs.ID.ToString())
    {
        unCheckedStates.Add(wfs.ID);
    }
}
dynamicdataentrances = 
    dynamicdataentrances.Where(d => !unCheckedStates
                        .Contains(d.WorkflowStateRelation.WorkflowStateID))
                        .AsQueryable();
于 2013-08-18T14:47:01.043 回答