2017-04-24 1 views
-1

EF에서 Linq에 대한 도움이 필요합니다. 세 가지 종류 (Kind1, Kind2, Kind3)의 열거 형인 Type EKind의 "CustomerKind"열이있는 고객 테이블이 있습니다.EF Linq의 스위치

"Kind1Details", "Kind2Details"및 "Kind3Details"와 같은 추가 테이블도 있습니다. 이 세부 정보 테이블에는 모두 특수 Name (열 이름)이 있습니다.

이제는 EF Linq 문을 사용하여 정보를 얻고 싶습니다. CustomerKind가 Kind1이면 Kind2Details의 Kind2이고 Kind3Details의 Kind3 인 경우 테이블 Kind1Details의 이름을 원합니다. 그래서 실제로 select new 절에서 스위치가 필요합니다. like :

  var customerList=from customer in context.Customer 
          select new 
          { 
           Id=customer.Id, 
           Kind=customer.CustomerKind, 
           if(Kind==EKind.Kind1) 
            Name=customer.Kind1.Name 
            if (Kind == EKind.Kind2) 
            Name = customer.Kind2.Name 
           if (Kind == EKind.Kind3) 
            Name = customer.Kind3.Name 
          } 

나는 모든 데이터를로드하고 쿼리를 통해 다시 처리 할 수 ​​있지만 더 좋은 방법이있을 수 있습니다.

마침내 얻었습니다. 감사합니다. 여기 내 작업 솔루션입니다 :

var customerList = from customer in context.Customer 
        select new 
        { 
         Id = customer.Id, 
         Kind = customer.CustomerKind, 
         Name1 = (Kind == EKind.Kind1) ? customer.Kind1.Name : null, 
         Name2 = (Kind == EKind.Kind2) ? customer.Kind2.Name : null, 
         Name3 = (Kind == EKind.Kind3) ? customer.Kind3.Name : null, 

         Age1 = (Kind == EKind.Kind1) ? customer.Kind1.Age : 0, 
         Age2 = (Kind == EKind.Kind2) ? customer.Kind2.Age : 0, 
         Age3 = (Kind == EKind.Kind3) ? customer.Kind3.Age : 0, 

        }; 

return customerList.Select(r => new CustomerOV 
{ 
    Age = r.Age1 + r.Age2 + r.Age3, 
    Name = r.Name1 ?? r.Name2 ?? r.Name3, 
}).ToList(); 

니코 다른 대답에 코멘트를 만들려고

+0

당신이 찾고있는 단어는 [차별] (이라고 생각 http://stackoverflow.com/questions/24333297/엔티티 프레임 워크 - 케이스 - 온 - discriminator) – CodingYoshi

+1

[? : 조건부 연산자] (https://msdn.microsoft.com/en-us/library/ty67wk28.aspx) –

+0

질문에 대답을 수정하지 마십시오. 귀하의 솔루션이 제공된 답변 중 하나와 크게 다른 경우, 귀하가 직접 답변을 제출하고 동의하십시오. 그러나 제공된 답변 중 하나가 유효하면 그 사실을 수락하십시오. 어쨌든 질문에 대답하지 마십시오. – krillgar

답변

-1
var customerList = from customer in context.Customer 
         select new { 
          Id=customer.Id, 
          Kind=customer.CustomerKind, 
          Name = (Kind == EKind.Kind1) ? customer.Kind1.Name : 
            (Kind == EKind.Kind2) ? customer.Kind2.Name : 
            (Kind == EKind.Kind3) ? customer.Kind3.Name : "bad kind", 
          Age = (Kind == EKind.Kind1) ? customer.Kind1.Age : 
            (Kind == EKind.Kind2) ? customer.Kind2.Age : 
            (Kind == EKind.Kind3) ? customer.Kind3.Age : 0 
         }; 
+0

이 경우 컴파일러 오류가 발생합니다. CS0746 잘못된 익명 형식 멤버 선언자가 있습니다. 익명 형식 멤버는 멤버 할당, 단순한 이름 또는 멤버 액세스로 선언해야합니다. 익명 형식은 멤버 할당, 단순한 이름 또는 멤버 액세스로 선언해야합니다. – Dosihris

+0

죄송합니다. 입력하신 원본 답변이 잘못되었습니다. – NetMage

2

는하지만, 너무 오래했다. ?: 연산자는 할당의 오른쪽을 생산, 그래서 올바른 방법이 될 것입니다 사용 :

var customerList = from customer in context.Customer 
        select new 
        { 
         Id = customer.Id, 
         Kind = customer.CustomerKind, 
         Name = (Kind == EKind.Kind1) 
          ? customer.Kind1.Name 
          : (Kind == EKind.Kind2) 
           ? customer.Kind2.Name 
           : (Kind == EKind.Kind3) 
            ? customer.Kind3.Name 
            : "Unknown Kind" 
        }; 
+0

감사합니다 루퍼스,이 모양이 좋지는 않지만 작동합니다. 나는 그것을 좀 더 명확하게하고 나의 초기화 글에서 내 자신의 질문에 대답했다. 감사 – Dosihris