2011-11-26 64 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