2012-11-07 43 views
0

在QueryableEntities方法如下, IEnumerable<Competition>.AsQueryable()将返回IQueryable<Competition>这是无法返回,因为它期待IQueryable<T>是否可以将IQueryable <SomeClass>返回给IQueryable <T>方法?

如果有人知道如何做到这一点,请我可以只写一个方法返回IQueryable<Competition>IQueryable<Submission>

让我知道,谢谢

public partial class WinBoutsDataContext<T> : System.Data.Linq.DataContext where T : class 
{ 
    public IQueryable<T> QueryableEntities 
    { 
     get 
     { 
      if (typeof(T).Equals(typeof(Model.Competition))) 
      { 
       return this.ConvertToCompetitionList(
         this.GetTable<Storage.Competition>()).AsQueryable(); 
      } 
      else if(typeof(T).Equals(typeof(Model.Submission))) 
      { 
       return this.ConvertToSubmissionList(
         this.GetTable<Storage.CompetitionEntry>()).AsQueryable(); 
      } 
     } 
    } 

    public DataAccess.Model.Competition ConvertToCompetition(DataAccess.Storage.Competition comp) 
    { 

     DataAccess.Model.Competition modelComp = new DataAccess.Model.Competition 
     { 
      CompetitionID = comp.CompetitionID, 
      Active = comp.Active, 
      CompetitionStatusID = 
      comp.CompetitionStatusID, 
      Duration = comp.Duration, 
      EndDate = comp.EndDate, 
      Entrants = comp.Entrants, 
      Featured = comp.Featured, 
      Image = comp.Image, 
      IsOvertime = comp.IsOvertime, 
      MaxEntrants = comp.MaxEntrants, 
      Notes = comp.Notes, 
      OvertimeDuration = comp.OvertimeDuration, 
      OvertimeEnd = comp.OvertimeEnd, 
      OvertimeStart = comp.OvertimeStart, 
      ParentCompetitionID = comp.ParentCompetitionID, 
      Prize = comp.Prize, StartDate = comp.StartDate, 
      SuggestedBy = comp.SuggestedBy, 
      Summary = comp.Summary, 
      Title = comp.Title 
     }; 

     return modelComp; 
    } 

    public IEnumerable<DataAccess.Model.Competition> ConvertToCompetitionList(IEnumerable<DataAccess.Storage.Competition> compList) 
    { 
     List<DataAccess.Model.Competition> compModelList = new List<DataAccess.Model.Competition>(); 

     foreach (DataAccess.Storage.Competition comp in compList) 
     { 
      compModelList.Add(ConvertToCompetition(comp)); 
     } 

     return compModelList; 
    } 
} 

回答

2

同意由阿德里安设计原则的意见,但如果你想这样做这样

public IQueryable<T> QueryableEntities 
{ 
    get 
    { 
     if (typeof(T).Equals(typeof(Model.Competition))) 
     { 
      return this.ConvertToCompetitionList(
        this.GetTable<Storage.Competition>()).AsQueryable() as IQueryable<T>; 
     } 
     else if(typeof(T).Equals(typeof(Model.Submission))) 
     { 
      return this.ConvertToSubmissionList(
        this.GetTable<Storage.CompetitionEntry>()).AsQueryable() as IQueryable<T>; 
     } 
    } 
} 

编译和运行正常。这里的x as IQueryable<T>如果它可以被转换,则x转换为IQueryable<T>,如果它不能转换,则转换为null

注:这意味着,当你建立你的泛型类,如果它的类型是Model.Competition它将返回IQueryable<Model.Competition>,如果它的类型是Model.Submission它将返回IQueryable<Model.Submission>,并将返回null任何其他类型。

+0

非常感谢.....它做到了! – Bitsian

0

通常最好不要一概而论。许多开发人员似乎花费大量时间试图让一个属性/方法/类做很多事情,但是它违背了很多面向对象的原则。我个人只会使用2个属性,可能是Competitions,另一个是Submissions。这将比QueryableEntities更多的意图透露。

相关问题