2013-06-27 1 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에 따라 다릅니다. IMO이 방법에서 <T>을 제거하고 나머지는 TProductionData으로 직접 대체해야합니다. 주석으로


: 나는 비슷한 속성 이름을 가진 다른 L2S 수업을

하지만, 그건 내가 값의 할당을 분리해서하고 싶은 이유 중 하나입니다. 예를 들면. 나는 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 {...} 

그리고는 ProductionData: ISpec를 추가합니다. ProductionData가 생성 된 파일 인 경우, 는 생성 된 파일을 편집하지 마십시오 - 대신에 별도의 코드 파일을 추가합니다

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

될 것이다 결합하여 생성 된 파일을 (컴파일러에 의해), 암시 적 사용 인터페이스 구현이 인터페이스 구성원을 선택합니다.

그리고는 where T : class, ISpecwhere T : class에서 Assign<T> 제약 조건을 변경하고는 를 작동합니다. 분명히 귀하의 데이터가 decimal이 아닌 경우 ISpec으로 변경하십시오.

+0

하지만 비슷한 속성 이름을 가진 다른 L2S 클래스가 있는데, 그 이유 중 하나는 값 할당을 분리하려고했던 이유 중 하나입니다. 예를 들면. 나는 ProductionDataRenewed, ProductionDataDiscarded 등의 클래스를 가지고있다.이 L2S 클래스들은 모두 3 개의 유사한 특성 인 Spec1, Spec2, Spec3을 가지고있다. GetData와 비슷한 몇 가지 기능이 있습니다. – Dilberted

+0

코드 샘플을 업데이트했습니다. 나는 그것이 지금 더 명확 할 것이기를 바란다. :) – Dilberted

+0

@Dilberted "비슷한 이름을 가짐"은 일반적인 것이 아닙니다. 그러나 그 시나리오에서 또 다른 옵션이 제시됩니다 - 편집합니다. –

관련 문제