泛型获取方法不包括 FK

本文关键字:FK 不包括 方法 获取 泛型 | 更新日期: 2023-09-27 18:35:51

我正在尝试创建一个通用的 GetAll 方法,该方法适用于我的 ASP.NET MVC4 项目中的每个模型类。

这是我的代码:

public static List<T> GetAll(params string[] includeProperties)
{
    using (MovieSiteDb db = new MovieSiteDb())
    {
        var entities = db.Set<T>();
        foreach (var includeProperty in includeProperties)
        {
            entities.Include(includeProperty);
        }
        return entities.ToList();
    }
}

现在我用以下方式调用它(Movie 继承 GetAll 方法):

Movie.GetAll("Category");

但是,当我尝试访问视图模型中的外键"类别"时,我收到错误。为什么它没有被包括在内?

泛型获取方法不包括 FK

我不能说我自己使用过 EF,但一般来说,当您调用方法时,LINQ 不会改变查询 - 而是返回一个新查询。因此,如果您将代码更改为:

DbQuery<T> entities = db.Set<T>();
foreach (var includeProperty in includeProperties)
{
    entities = entities.Include(includeProperty);
}

您可能会发现这可以解决问题。

entities的类型现在固定为 DbQuery<T>,而不是使用 var 将其隐式键入DbSet<T>,因为Include返回DbQuery<T>

这是我

的通用存储库的一部分,其中包含一个可以使用lambda表达式调用的AllIncluding方法

private readonly IUnitOfWork _UnitOfWork;
protected MyContext Context { get { return Uow.Context; } }
protected IUnitOfWork Uow
{
    get { return _UnitOfWork; }
}
public RepositoryBase(IUnitOfWork unitOfWork)
{
    _UnitOfWork = unitOfWork;
}
public virtual IQueryable<T> All
{
    get
    {
        return Context.Set<T>();
    }
}
public virtual IQueryable<T> AllIncluding(params Expression<Func<T
                                          , object>>[] includeProperties)
{
    IQueryable<T> query = All;
    foreach (var includeProperty in includeProperties)
    {
        query = query.Include(includeProperty);
    }
    //string sql = query.ToString();
    return query;
}

下面是我如何从控制器调用它的示例:

   IRepository<Answer> repo = _Uow.AnswerRepository;
   IOrderedQueryable<Answer> answers = repo.AllIncluding(answer => answer.Questions)
                                        .OrderBy(answer => answer.SortOrder)
                                        .ThenBy(answer => answer.Text);

在这里进入工作单元和其他东西

对于您对 lambda 表达式的关注,我知道您可以在下面执行

var prodcutmasters = this.db.ProdcutMasters.Include(p => p.CategoriesMaster);
return (prodcutmasters.ToList());