我用来过滤对象的代码如下:
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();
}
你可以弄清楚,我使用复选框进行过滤;如果未选中“工作流状态”复选框,则会获得工作流状态不等于未选中状态的对象。我调试了行,foreach以及块是否正常工作,但查询不起作用,它不断获取所有对象。这是一个错误还是我做错了什么?
如果我在工作流状态过滤之前将对象集合转换为列表,则它可以正常工作。
答案 0 :(得分:0)
使用列表它可以工作,因为对象已经在内存中,并且对于每个未检查的状态,不排除对象。
但是,使用 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();