2017-02-21 1 views
-2

나는 다음과 같은 코드를 아래와 같이 작성했습니다 :LINQ 연합 작동하지 제대로

ViewBag.result = allStoreItems.Union(Enumerable.Range(1, 30) 
      .Select(offset => new StoreAnalyticOrders { OrderDate = DateTime.Now.AddDays(-(30)).AddDays(offset), AmountPaid = 0 })) 
       .SelectMany(x => x.StoreItemTransactions) 
       .GroupBy(x => x.TransactionDate.Value.Date) 
       .Select(cl => new StoreAnalyticOrders { 
        OrderDate = cl.Key, 
        AmountPaid = cl.Sum(c => c.TransactionPrice) 
       }) 
       .OrderBy(x => x.OrderDate.Date) 
       .ToList(); 

는 기본적으로 어떤이 코드가 수행하는 DB 테이블에서 그룹 내 avalilable 날짜이며, 그룹화 된 일에 대한 값의 합계를 구합니다. 내 DB에 존재하지 않는 실종 날짜를 추가하기 위해 노력하고있어

.Union(Enumerable.Range(1, 30) 
.Select(offset => new StoreItemTransactions { TransactionDate = DateTime.Now.AddDays(-(30)).AddDays(offset), TransactionPrice = 0 })) 

:

는 다음 코드 부분을 유의하시기 바랍니다. 그래서 예를 들어 내가 '경우 다음과 같이 날짜가 :

Date   Amount 
21 Feb. 2017 (some amount here) 
19 Feb. 2017 
13 Feb. 2017 

이제 출력이 누락 된 일 + 이미 (2017년 2월 21일입니다) 오늘 날짜에서 존재하는 사람이 될 것입니다;

출력해야한다 : 당신이 볼 수있는 0의 값을 할당 목록에없는

Date    Amount 
21 Feb. 2017 (some amounts here) 
20 Feb. 2017 
19 Feb. 2017 
18 Feb. 2017 
17 Feb. 2017 
16 Feb. 2017 
15 Feb. 2017 
14 Feb. 2017 
13 Feb. 2017 
12 Feb. 2017 
11 Feb. 2017 
10 Feb. 2017 
... all the way back to 21 Feb. -30 days 

날짜 ... 그 외에는

이 allStoreItems가의 입력 목록입니다 StoreItems 당신은 내가보기에이 두 속성을 표시 방금 만든 (사용자 정의 클래스의 새로운 유형을 만드는거야 볼 수 있듯이,

내가 여기지고있어 오류는 다음과 같습니다

List<StoreItems> does not contain a definition for 'Union' and the best extension method overload Queryable.Union<StoreAnalyticOrders>(IQueryable<StoreAnalyticOrders>) requires a receiver of Type IQueryable<StoreAnalyticOrders> 

무엇이 잘못 되었나요? 어떻게 해결할 수 있습니까?

+2

그것은 것처럼 사용할 수 있습니다 될 수 있다는 AmountPaid 당신은 주문 날짜를 비교하려는 것을 표시하고 무시하는 방법을 작성해야하지만 여기저기서 [mcve]를 제공 할 수 있다면 당신을 도울 수 있습니다. 특히 첫 번째 목록에서 강조 표시된 부분이 변경되었습니다 (StoreAnalyticOrders 대 StoreItemTransactions, OrderDate 및 TransactionDate 등). –

+1

(필자도'DateTime '사용을 강력히 권유한다.지금 당신이 서버의 기본 시간대에 의존하기를 원하지 않는다면 서버 측 코드로 저장하십시오.) –

+0

@JonSkeet DateTimeUTC.Now를 사용해야합니까? 추신 이 날짜와 TransactionDate가 같은 유형이라면 무엇을 요구합니까? =) – User987

답변

1

당신이 allStoreItems과 같은 유형으로을 필요로하고 있지 않기 때문에, 당신이 당신의 오류가 다음 무엇을 다음

 allStoreItems.Union(...) 

로 시작합니다. 따라서 나중에 노동 조합을 옮겨야합니다. 가장 간단한 방법은 두 개의 목록을 작성한 다음 결합하는 것입니다.

는 위의 작품이라고 가정 목록

var list1 = allStoreItems 
      .SelectMany(x => x.StoreItemTransactions) 
      .GroupBy(x => x.TransactionDate.Value.Date) 
      .Select(cl => new StoreAnalyticOrders { 
       OrderDate = cl.Key, 
       AmountPaid = cl.Sum(c => c.TransactionPrice) 
      }) 
      .OrderBy(x => x.OrderDate.Date) 
      .ToList(); 

이 있고 그런 다음 연합 (EU)을 사용하여 이러한 목록을 결합 할 수 있습니다

var list2 = Enumerable.Range(1, 30) 
     .Select(offset => new StoreAnalyticOrders { OrderDate = DateTime.UtcNow.Date.AddDays(-(30)).AddDays(offset), AmountPaid = 0 }).ToList(); 

하여 두 번째 목록을 얻을 수 있습니다 당신에게 List<StoreAnalyticOrders>를 제공하자. 당신은

public class StoreAnalyticOrdersComparer : IEqualityComparer<StoreAnalyticOrders> 
{ 
    bool IEqualityComparer<StoreAnalyticOrders>.Equals(StoreAnalyticOrders s1, StoreAnalyticOrders s2) 
    { 
     return s1.OrderDate == s2.OrderDate; 
    } 

    int IEqualityComparer<StoreAnalyticOrders>.GetHashCode(StoreAnalyticOrders obj) 
    { 
     if (Object.ReferenceEquals(obj, null)) 
      return 0; 

     return obj.OrderDate.GetHashCode(); 
    } 
} 

이를 같은 것이

ViewBag.result = list1.Union(list2, new StoreAnalyticOrdersComparer()) 
         .OrderBy(a=>a.OrderDate).ToList();