2

我正在使用 EF 4.3.1,并且正在执行 Code First 的第一个实现并测试数据。这是我尝试实现急切加载的设置。

public class Model 
{
    public int Id { get; set; }
    public ICollection<ModelArchive> ModelArchives { get; set; }
}

public class ModelArchive 
{
    public int Id { get; set; }
    public ICollection<Option> Options { get; set; }
}

public class Option 
{
    public int Id { get; set; }
    public bool Deleted { get; set; }
}

我希望能够在我的查询中仅选择已删除 == false 的选项。到目前为止,我是空的,或者在运行查询时会导致异常。

这是我当前的查询:

using (var db = new ModelContainer())
{
    db.Configuration.LazyLoadingEnabled = false;

    var model = db.Models.Where(m => m.Id == 3)
                  .Include(m => m.ModelArchives.Select(o => o.Option).Where(o => o.Deleted == false));
}

异常:消息 =“包含路径表达式必须引用在类型上定义的导航属性。对引用导航属性使用虚线路径,对集合导航属性使用 Select 运算符。\r\n参数名称:路径”

任何帮助,将不胜感激。

4

3 回答 3

0

您无法使用 Entity Framework 加载过滤后的数据。导航属性要么包含所有相关实体,要么不包含任何实体。

考虑进行手动加入并返回未删除选项的匿名对象。

于 2013-08-05T15:07:13.430 回答
0

您禁用延迟加载是正确的。但是您必须在子查询中过滤导航属性,EF 会神奇地将其附加到您的主查询中。这是应该起作用的东西

using (var db = new ModelContainer())
{
    db.Configuration.LazyLoadingEnabled = false;

    var filteredModelArchives = db.ModelArchives.Select(o => o.Option).Where(o => o.Deleted == false).Include("Options");

    var model = db.Models.Where(m => m.Id == 3);
}
于 2013-10-09T09:36:11.113 回答
0

你可以试试

using (var db = new ModelContainer())
{
//db.Configuration.LazyLoadingEnabled = false;

var model = db.Models.Where(m => m.Id == 3 && m.ModelArchives.Option.Deleted==false)
              .Include(m => m.ModelArchives.Option);
}  

您可以使用通用函数来获取数据

 public  List<T> IncludeMultipleWithWhere(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includes)
    {
        IQueryable<T> itemWithIncludes = dbContext.Set<T>() as IQueryable<T>;
        try
        {
            if (includes != null)
            {
                itemWithIncludes = includes.Aggregate(itemWithIncludes,
                          (current, include) => current.Include(include)).Where(predicate);
            }

        }
        catch (Exception ex)
        {

        }
        finally { }
        return itemWithIncludes.ToList();

    }

您的调用函数只需要传递参数

 Expression<Func<Models, bool>> whereCond1 =  (m) => m.Id == 3 && m.ModelArchives.Option.Deleted==false;
 Expression<Func<Models, object>>[] includeMulti = { m => m.ModelArchives.Option };
于 2013-08-05T15:45:59.640 回答