2

我得到了与这三个表的:m-Relationship:

数据库模型

现在我想查询所有附加Activities了选定列表的。Characteristics

我的查询:

e.QueryableSource = _dataContext.Activities.Where(ac => 
                ac.UserId == _userId && 
                ac.ResubmissionDate <= EntityFunctions.TruncateTime(_to) && 
                ac.Priority <= (int)_prio && 
                ac.CompletedDate == null && 
                ac.Characteristics.Contains(CharacFilter));

可悲的是,这不起作用,正如ac.Characteristics.Contains()预期的那样 typeActivityCharacteristics的项目,而不是Characteristic

我怎样才能做到这一点?

侧节点:我不想要排他过滤,比如当我在 中指定三个特征时CharacFilter,我想查询可能附加了这三个特征之一(不一定全部)的每个活动。

编辑: CharacFilterprivate IEnumerable<int> CharacFilter { get; set; } 是从我选择这些特征并将它们保存在 View-Variable 的视图中填充的public List<Characteristic> SelectedCharacteristics { get; set; }

我的任务:

        var view = new AssignCharacteristicsView();
        view.ShowDialog();

        if (view.SelectedCharacteristics != null)
        {
            CharacFilter = view.SelectedCharacteristics.Select(cf => cf.Id);
        }

`

4

1 回答 1

4

如果CharacFilterIEnumerable<Characteristics>,您可以尝试:

IEnumerable<int> charaFilters = CharacFilter.Select(cf => cf.Id);

e.QueryableSource = _dataContext.Activities.Where(ac => 
    ac.UserId == _userId && 
    ac.ResubmissionDate <= EntityFunctions.TruncateTime(_to) && 
    ac.Priority <= (int)_prio && 
    ac.CompletedDate == null &&
    ac.Characteristics.Any(acc => characFilters.Contains(acc.CharacteristicId)));

acc是类型ActivityCharacteristics。)

并且Activity.Characteristics应该真正具有您在实体Activity.ActivityCharacteristics中命名的名称。Characteristics否则很混乱。

编辑

关于你的例外

无法创建类型为“System.Collections.Generic.IEnumerable´1”的常量值

如果CharacFilternull,您确实会收到此异常,因为null它是 EF 无法创建的常量值。它不会抛出 aNullReferenceException因为您CharacFilter在表达式中使用。根据您在问题中编辑的代码CharacFilter可能是nullif view.SelectedCharacteristicsis null

要解决问题,您必须null根据应用程序中是否view.SelectedCharacteristics == null表示所有特征或没有特征来捕捉案例。如果这意味着没有,我建议实例化一个空列表:

if (view.SelectedCharacteristics != null)
{
    CharacFilter = view.SelectedCharacteristics.Select(cf => cf.Id);
}
else
{
    CharacFilter = new List<int>();
}

如果这意味着您可以尝试所有特征:

// ...
ac.Characteristics.Any(acc => (characFilters != null
    ? characFilters.Contains(acc.CharacteristicId)
    : true)));

编辑 2

最后一个选项抛出相同的异常(这并不奇怪,因为必须再次创建CharacFilter与常量值进行比较)。null替代方案(只需省略最后一个Where子句 if CharacFilteris null):

ObjectQuery<Activity> query = _dataContext.Activities.Where(ac => 
    ac.UserId == _userId && 
    ac.ResubmissionDate <= EntityFunctions.TruncateTime(_to) && 
    ac.Priority <= (int)_prio && 
    ac.CompletedDate == null);

if (characFilters != null)
{
    query = query.Where(ac => ac.Characteristics
                     .Any(acc => characFilters.Contains(acc.CharacteristicId)));
}

e.QueryableSource = query;
于 2012-07-11T18:54:55.287 回答