0

以下の QueryableEntities メソッド では、期待しているため返すことができないものをIEnumerable<Competition>.AsQueryable()返しますIQueryable<Competition>IQueryable<T>

返すメソッドは 1 つしか記述できず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;
    }
}
4

2 に答える 2

2

Adrian による設計原則に関するコメントに同意しますが、このようにしたい場合は

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>与えます。xIQueryable<T>null

注: これは、ジェネリック クラスを構築すると、型がある場合Model.Competitionは を返しIQueryable<Model.Competition>、型がある場合Model.Submissionは を返しIQueryable<Model.Submission>null他の型の場合は を返すことを意味します。

于 2012-11-07T10:09:22.083 に答える
0

通常、一般化しないことが最善です。多くの開発者は、1 つのプロパティ/メソッド/クラスに多くのことをさせようと多くの時間を費やしているようですが、それは多くのオブジェクト指向の原則に反しています。個人的には、おそらく呼ばれる2つのプロパティとCompetitionsもう1つのプロパティを使用しますSubmissions。よりもはるかに多くの意図を明らかにするでしょうQueryableEntities

于 2012-11-07T09:31:43.547 に答える