2013-06-27 34 views
1

我想創建一個通用函數來從查詢中提取並將其分配給對象。看來實際的linq2sql對象在通用函數中沒有得到解決,以暴露其中的屬性。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; 
} 

回答

1

AssignValue<T>方法實際上不是通用的 - 這是特定於ProductionData。國際海事組織,你應該從這種方法中刪除<T>並直接替換任何剩餘的TProductionData


隨着評論:

但我有一些其他的L2S類具有類似屬性的名稱,那就是我想單獨值的分配的原因之一。例如。我有一個類 - ProductionData,ProductionDataRenewed,ProductionDataDiscarded等。所有這些L2S類都有3個類似的屬性Spec1,Spec2,spec3。

然後這裏的另一個選擇是「接口和約束」;例如:

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 {} 
} 

這將是組合(由編譯器)與所生成的文件中,使用隱式接口實現來獲取接口成員。

與變革where T : classAssign<T>約束where T : class, ISpec,它應該工作。很顯然,如果您的數據不是decimal相應地更改ISpec

+0

但我有一些其他的L2S類具有類似的屬性名稱,這是我想分開值的分配的原因之一。例如。我有一個類 - ProductionData,ProductionDataRenewed,ProductionDataDiscarded等。所有這些L2S類都有3個類似的屬性Spec1,Spec2,spec3。我有更多的功能類似於GetData – Dilberted

+0

我已經更新了代碼示例。我希望現在會更清楚。 :) – Dilberted

+0

@Dilberted「有相似的名字」不是通用的。但是,在這種情況下,另一個選項將出現 - 將被編輯。 –

相關問題