2011-11-26 30 views
1

我不能得到QueryObjectGraph添加INCLUDE子表,如果我的生命依赖于它...我错过了什么?卡住第三天的东西,应该是简单的: -/EF多对多dbset.In包括DAL GenericRepository

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库

public interface IBreed_TranslatedSqlRepository : ISqlRepository<Breed_Translated> 
{ 
} 

public class Breed_TranslatedSqlRepository : RepositoryBase<Breed_Translated>, 
    IBreed_TranslatedSqlRepository 
{ 

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

} 

BLL回购:

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

控制器:

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

我不能达到Breed.AnimalType_Breed.AnimalTypeId ..我可以钻到Breed.AnimalType_Breed那么intelisense期望一个表达式?

线索如有DB表:大胆是许多一对多 品种,Breed_Translated,AnimalType_Breed,AnimalType,...

回答

0

AnimalBreed_Type re呈现多对多关系,所以物业Breed_Translated实体是集合!集合类型没有您的表格属性。您必须使用FirstSingle从此集合中获取单个相关实体,并检查它是否为AnimalTypeId

+0

谢谢拉迪斯拉夫,我能够在一小时内再次开始编码,所以我会更多地摔跤。再次感谢你提供的建议。 – Bryant

+0

我知道它使用First()!!!!!!!!!! :-)我现在必须清理它[我会尝试反正..mine是如此丑陋的大声笑],但感谢帮助x 1000不再被卡住是一种伟大的感觉!无论如何这里是什么工作: – Bryant

+0

var breeds1 = _breedTranslatedRepository.QueryObjectGraph(b => b.Culture ==文化,“品种”,“Breed.AnimalType_Breed”)。 VAR breeds2 = breeds1.Where(A => a.Breed.AnimalType_Breed.First()。AnimalTypeId == animalTypeId).ToList() 。选择(A =>新SelectListItem() { 文本= a.BreedNameTranslated , Value = a.BreedId。ToString(), }); return Json(breeds2); – Bryant

0

如果你看一下它包含有一个返回类型。 Linq大多是功能性的,所以它不会改变任何对象,而是返回新的对象。您需要改为存储这个新对象。

尝试:

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

return query; 

其他说明:您可以简化这个:

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

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

当你的方法需要一个PARAMS字符串[]参数

+0

嗨Mikael,感谢您的意见。我将能够尝试一下这一点和上面的内容。再次感谢你的帮助。 – Bryant

+0

我清理了我传入的字符串参数,就像你建议的那样。感谢:-) – Bryant

+0

并清理了包括在我的repoBase中的foreach,如图所示......谢谢 – Bryant