EF Many-to-many dbset.Include in DAL on GenericRepository

夙愿已清 提交于 2019-12-11 12:26:30

问题


I can't get the QueryObjectGraph to add INCLUDE child tables if my life depended on it...what am I missing? Stuck for third day on something that should be simple :-/

DAL:

public abstract class RepositoryBase<T> where T : class
{
    private MyLPL2Context dataContext;
    private readonly IDbSet<T> dbset;


    protected RepositoryBase(IDatabaseFactory databaseFactory)
    {
        DatabaseFactory = databaseFactory;
        dbset = DataContext.Set<T>();

        DataContext.Configuration.LazyLoadingEnabled = true;
    }

    protected IDatabaseFactory DatabaseFactory
    {
        get;
        private set;
    }

    protected MyLPL2Context DataContext
    {
        get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
    }

    public IQueryable<T> QueryObjectGraph(Expression<Func<T, bool>> filter, 
       params string[] children)
    {
        foreach (var child in children)
        {
            dbset.Include(child);
        }

        return dbset.Where(filter);
    }

... DAL repositories

 public interface IBreed_TranslatedSqlRepository : ISqlRepository<Breed_Translated>
 {
 }

 public class Breed_TranslatedSqlRepository : RepositoryBase<Breed_Translated>, 
    IBreed_TranslatedSqlRepository
 {

    public Breed_TranslatedSqlRepository(IDatabaseFactory databaseFactory)
        : base(databaseFactory)
    {}

 }

BLL Repo:

 public IQueryable<Breed_Translated> 
    QueryObjectGraph(Expression<Func<Breed_Translated, bool>> filter, 
        params string[] children)
    {
        return _r.QueryObjectGraph(filter, children);
    }

Controller:

  var breeds1 = _breedTranslatedRepository
    .QueryObjectGraph(b => b.Culture == culture, new string[] { "AnimalType_Breed" })
    .ToList();

I can't get to Breed.AnimalType_Breed.AnimalTypeId ..I can drill as far as Breed.AnimalType_Breed then the intelisense expects an expression?

Cues if any, DB Tables: bold is many-to-many Breed, Breed_Translated, AnimalType_Breed, AnimalType, ...


回答1:


AnimalBreed_Type represents many to many relation so the AnimalBreed_Type property in Breed_Translated entity is collection! The collection type doesn't have your table properties. You must use First or Single to get single related entity from this collection and check it's AnimalTypeId.




回答2:


If you look at Include it has a return type. Linq is mostly functional so it will NOT alter any objects but rather return new ones. You need to store this new object instead.

Try:

var query = dbset.Where(filter);
foreach (var child in children)
{
    query = query.Include(child);
}

return query;

OTHER NOTE: You can simplify this:

var breeds1 = _breedTranslatedRepository
    .QueryObjectGraph(b => b.Culture == culture, new string[] { "AnimalType_Breed" })
    .ToList();

To

var breeds1 = _breedTranslatedRepository
    .QueryObjectGraph(b => b.Culture == culture, "AnimalType_Breed")
    .ToList();

When you methods takes a params string[] argument



来源:https://stackoverflow.com/questions/8277089/ef-many-to-many-dbset-include-in-dal-on-genericrepository

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!