2017-12-28 44 views
2

내가 가진라는 이름의 테이블 세 개의 레코드와 dbo.EmployeeType :의 LINQ 코드는 정확한 기록을 반환하지 않습니다

public static string GetTypeByID(int id) 
{ 
    using (ProjectTrackingEntities1 db = new ProjectTrackingEntities1()) 
    { 
     var type = db.EmployeeTypes.Select(o => new LOOKUPEmployeeType 
     { 
      PK_EmployeeTypeID = id, 
      EmployeeTypeName = o.EmployeeTypeName 
     }); 

     return type.FirstOrDefault().EmployeeTypeName; 
    } 
} 

상관없이 내가에게 보낼 것을 ID :

PK_EmployeetypeID EmployeeTypeName 
1     Project Manager 
2     Business Analyst 
3     Developer 

나는 Linq에 코드의 조각이 그것, 그것은 Project Manager을 반환하고, 왜 나는 혼란 스럽습니다.

+0

'type = ...'에 중단 점을 설정하고 검사하십시오. 거기에 아무 것도 없기 때문에 모두를 얻을 수 있습니다. Select는 LOOKUPEmployeeTypes를 모두 만들어줍니다. FirstOrDefault는 항상 ProjManager 인 첫 번째를 반환합니다. –

+0

코드는 항상 "첫 번째"값을 반환합니다 (DB가 "특별한 순서없이 첫 번째"로 간주됩니다).이 코드가 무엇을 기대합니까? (또는 게시물을 upvoted 사람이 같은 일을했을 수도). –

답변

7

필터를 적용해야합니다. 그렇지 않으면 첫 번째 레코드를 반환하고 ID를 하드 코딩합니다. 이 시도 : 더 일치, 또는 다수의 일치가없는 경우 FirstOrDefault을 사용하여 의미

public static string GetTypeByID(int id) 
{ 
    using (ProjectTrackingEntities1 db = new ProjectTrackingEntities1()) 
    { 
     //Here we apply a filter, the lambda here is what creates the WHERE clause 
     var type = db.EmployeeTypes 
      .FirstOrDefault(et => et.PK_EmployeeTypeID == id); 

     if(type != null) 
     { 
      return type.EmployeeTypeName; 
     } 
     else 
     { 
      return ""; 
     } 
    } 
} 

주, typenull 될 것입니다 그리고 당신은 빈 문자열이 반환 받게됩니다.

+0

아, 그건 의미가 있고 내가하려고했던 것보다 훨씬 더 깨끗합니다. – DForck42

+0

물론 레코드가 발견되지 않으면 빈 문자열을 반환하는 것과는 다른 일을 할 수 있습니다. – DavidG

+0

예, 데이터베이스의 필수 입력란이므로 이론상 절대로 안됩니다. – DForck42

2

type = ...에 중단 점을 설정하고 검사하십시오. Where이 없으므로 모든 것을 얻을 수 있습니다. Select은 단지 LOOKUPEmployeeTypes입니다.

FirstOrDefault는 항상 ProjManager

수정입니다 그 3의 첫 번째 반환

var type = db 
    .EmployeeTypes 
    .Where(o => o.Id == id) 
    .Select(o => new LOOKUPEmployeeType 
{ 
    PK_EmployeeTypeID = id, 
    EmployeeTypeName = o.EmployeeTypeName 
}); 
0

코드에서 당신이 첫 번째 값을 반환합니다. EF에게 어떤 가치를 반환해야하는지 알려줄 필요가 있습니다.

Id = 2 값이 필요하다고 가정 해 보겠습니다. Select() 대신 Single(x => x.Id == 2) 또는 First(x => x.Id == 2)을 사용하십시오.

관련 문제