1

クエリから を抽出してオブジェクトに割り当てる汎用関数を作成しようとしています。実際のlinq2sqlオブジェクトは、その中のプロパティを公開するために汎用関数で解決されていないようです。

どんな助けでも大歓迎です。

        public Production GetData()
        {
            var productionData = new Production();

            var query = (from o in _dbContext.ProductionDatas
                         select new Data<ProductionData>
                         {
                             td = _dbContext.ProductionDatas.Where(x => x.Timestamp <= _reportDate).ToList(),
                             mtd = _dbContext.ProductionDatas.Where(x => x.Timestamp >= _monthStartDate && x.Timestamp <= _reportDate).ToList(),
                             ytd = _dbContext.ProductionDatas.Where(x => x.Timestamp >= _yearStartDate && x.Timestamp <= _reportDate).ToList(),
                             today = _dbContext.ProductionDatas.FirstOrDefault(x => x.Timestamp == _reportDate),
                         }).FirstOrDefault();

            AssignValue(productionData, query);


            return productionData;
        }

        public Production GetDiscardedData()
        {
            var productionData = new Production();

            var query = (from o in _dbContext.ProductionDiscardedDatas
                         select new Data<ProductionData>
                         {
                             td = _dbContext.ProductionDiscardedDatas.Where(x => x.Timestamp <= _reportDate).ToList(),
                             mtd = _dbContext.ProductionDiscardedDatas.Where(x => x.Timestamp >= _monthStartDate && x.Timestamp <= _reportDate).ToList(),
                             ytd = _dbContext.ProductionDiscardedDatas.Where(x => x.Timestamp >= _yearStartDate && x.Timestamp <= _reportDate).ToList(),
                             today = _dbContext.ProductionDiscardedDatas.FirstOrDefault(x => x.Timestamp == _reportDate),
                         }).FirstOrDefault();

            AssignValue(productionData, query);


            return productionData;
        }

        private static void AssignValue<T>(Production productionData, Data<T> query) where T : class 
        {
            if (query != null)
            {
                productionData.Today.Spec1 = query.today.Spec1;
                productionData.Today.Spec2 = query.today.Spec2;
                productionData.Today.Spec3 = query.today.Spec3;

                productionData.MTD.Spec1 = query.mtd.Sum(x => x.Spec1 );
                productionData.MTD.Spec2 = query.mtd.Sum(x => x.Spec2 );
                productionData.MTD.Spec3 = query.mtd.Sum(x => x.Spec3 );

                productionData.YTD.Spec1 = query.ytd.Sum(x => x.Spec1 );
                productionData.YTD.Spec2 = query.ytd.Sum(x => x.Spec2 );
                productionData.YTD.Spec3 = query.ytd.Sum(x => x.Spec3 );

                productionData.TD.Spec1 = query.td.Sum(x => x.Spec1 );
                productionData.TD.Spec2 = query.td.Sum(x => x.Spec2 );
                productionData.TD.Spec3 = query.td.Sum(x => x.Spec3 );
            }
        }

public class Data<T>
{
    public List<T> mtd;
    public List<T> ytd;
    public T today;
    public List<T> td;
}
4

1 に答える 1

1

あなたのAssignValue<T>メソッドは実際には一般的ではありません - それはに固有のものProductionDataです。IMO をこのメソッドから削除し、残りを直接<T>置き換える必要があります。TProductionData


コメント付き:

しかし、同様のプロパティ名を持つ他の L2S クラスがいくつかあります。これが、値の割り当てを分離したい理由の 1 つです。たとえば。ProductionData、ProductionDataRenewed、ProductionDataDiscarded などのクラスがあります。これらのすべての L2S クラスには、Spec1、Spec2、Spec3 の 3 つの類似したプロパティがあります。

次に、ここでの他のオプションは「インターフェイスと制約」です。例えば:

interface ISpec {
    decimal Spec1 { get; }
    decimal Spec2 { get; }
    decimal Spec3 { get; }
}

と:

public class Data<T> where T : ISpec {...}

に追加: ISpecProductionDataます。が生成されたファイルの場合ProductionDataは、生成されたファイルを編集しないでください。代わりに、次のように別のコード ファイルを追加します。

namespace The.Correct.Namespace {
    partial class ProductionData : ISpec {}
}

これは (コンパイラによって) 生成されたファイルと結合され、暗黙的なインターフェイス実装を使用してインターフェイス メンバーを取得します。

Assign<T>制約を からwhere T : classに変更するwhere T : class, ISpecと、動作するはずです。明らかに、データがそれに応じてdecimal変更されない場合ISpec

于 2013-06-27T05:41:21.667 に答える