2011-04-26 6 views
10

최근에이 코드를 Entity Framework 4로 마이그레이션했는데 실패했습니다. 분명히 상태에 값이 없으면 모든 일치를 반환합니다. 일치하는 값이있는 경우 user.StatusID == 1입니다. 그러나Entity Framework 4의 간단한 조건부 LINQ 쿼리

ArgumentException: The specified value is not an instance of type 'Edm.Int32' 
Parameter name: value 

을 조건 테스트를 제거하고 그것을 잘 작동합니다 :

return users.SingleOrDefault(
       user => 
       user.Username == username && 
       user.EncryptedPassword == password && 
       (!status.HasValue || user.StatusID == 1) 
       ); 

예외가 반환

return users.SingleOrDefault(
       user => 
       user.Username == username && 
       user.EncryptedPassword == password && 
       user.StatusID == 1 
       ); 

어떤 아이디어? EF 4에서 조건부 테스트를 어떻게 수행합니까? 라인이 분리되지 않았습니까?

나는 이러한 조건부 테스트를 Linq에서 Sql으로 다시 사용합니다. EF 4에서 이것이 작동하지 않는 이유는 정말로 이상합니다. EF 4.0에서 뭔가를하는 것이 권장되는 대체 방법이있을 수 있습니다. 당신의 도움들에 대한

감사합니다,
그레이엄

+0

무엇이'Edm.Int32'입니까? 그것은 당신 자신의'System.Int32' 구현입니까? – Stecya

+1

@Stecya : http://msdn.microsoft.com/en-us/library/bb387164.aspx는 EF의 내부 구조로 보입니다. – Euphoric

답변

5

좋아, 두 가지를 조합하여 해결했습니다.

  1. 간단한 null 테스트를 수행합니다.
  2. 변수 status.Value없이 로컬 캐스트 테스트.

둘 다 있어야합니다. 그렇지 않으면 오류가 계속 발생하면서 실패합니다! value 속성을 테스트하는 것은 좋았을 것입니다.하지만 쿼리는 매우 간단해야합니다 - 매우 흥미 롭습니다!

return users.SingleOrDefault(
       user => 
       user.Username == username && 
       user.EncryptedPassword == password && 
       (status == null || user.StatusID == (int) status) 
       ); 

더 나은 구현을 기다리는 동안 그렇지 않으면 내 대답을 수락합니다. 그러나 모두의 도움에 감사드립니다.

+0

EF가 더 좋아 보이고 ... 해결책을 가져 주셔서 감사합니다. 오늘은 조금 깨졌습니다. – greenoldman

0

status.HasValue은 무엇인가? 상태가 User의 필드 인 경우 다음과 같이 호출한다 : user.status.HasValue

을 너무 간단하게이 작업을 수행 :

if(status.HasValue) 
    return users.SingleOrDefault(
       user => 
       user.Username == username && 
       user.EncryptedPassword == password && 
       user.StatusID == 1 
       ); 

    return users.SingleOrDefault(
       user => 
       user.Username == username && 
       user.EncryptedPassword == password 
       ); 
+0

안녕하세요 Farzin, nullable int이고 오히려 둘러싼 메서드의 필드입니다. – GONeale

+0

수정되었습니다.이 방법은 일반적인 해결책이 아니라 알고 있습니다. ;) –

+0

Eek, 두 개의 쿼리를 유지 보수합니다. 고마워,하지만 어쨌든 고마워.) – GONeale

0

을 당신이 괄호의 추가 세트에 user.StatusID == 1을 둘러싸로해야한다고 생각 I 현재 EF가 신청하려고한다고 생각합니다. || 작업을 status.HasValue 및 user.StatusId 결과를 1과 비교하십시오.

+0

아, 운이 없다. 그래도 좋은 생각. – GONeale

2

!status.HasValue에 대해 별도의 변수를 생성하고이를 쿼리에서 대신 사용하는 방법은 어떻습니까?

저는 여기 EF가 상태 변수를 쿼리의 매개 변수로 전달한 다음 SQL 자체에서 논리를 수행하려고합니다. 생성 된 SQL을 확인하십시오.

+0

와우, 그 패스,'var test =! status.HasValue' 선언 후 테스트. 그러나 좋지 않습니다. 그러나 그것은 내가 생각할 수있는 모든 캐스팅 및 브라켓 팅 트릭을 시도하게 만들었습니다. 확실히 이렇게 작동하면 인라인으로 작동 할 수 있고 둘 다 거짓을 해결할 수 있기 때문입니다. 흠. 더 이상의 생각? – GONeale

+0

나는 문제가 '상태'가 int가 아니라는 사실에 있다고 생각한다; 하나의 구조체에서 하나의 enum과 하나의 int 유형을 비교하는 것이 혼란스러워집니다. 캐스팅은 nullable이기 때문에 기능 할 수 없습니다. ( – GONeale

2

where 절에서 널 (NULL) 점검을 수행하는 다른 f}은 선택적 매개 변수를 분리하여 필요할 경우에만 적용하는 것입니다.

var data = users.Where(
     user => 
      user.Username == username && 
      user.EncryptedPassword == password 
     ); 

    if (status.HasValue) 
    { 
     data = data.Where(user => user.StatusID == status.Value); 
    } 

    return data.FirstOrDefault(); 

나는 현재의 솔루션보다 약간의 가독성을 제공 할 것이라고 생각하지 않습니다.

내 마음에이 같은 appeare 첫 galance에서
+0

아이디어 주셔서 감사합니다. – GONeale

0

:

return users.SingleOrDefault(
       user => 
       user.Username == username && 
       user.EncryptedPassword == password && 
       (status == null || user.StatusID == 1) 
       ); 

하지만 내가 볼 때 더 나는 무엇에 대해 너무 잘못 느낌?

return users.SingleOrDefault(
    user => 
    user.Username == username && 
    user.EncryptedPassword == password && 
    status != null && 
    user.StatusID == 1) 
); 

정확히 어떤 비즈니스 논리인가? 이미 해결책을 찾은 것 같은

+0

아, 글쎄요, 두 번째 쿼리는 항상 status는 반드시 필요한 것은 아니며'status'는'null'이 될 수 있으며,이 경우 모든 엔트리를 가져오고 싶습니다. 그래서'||'연산자를 사용합니다. – GONeale

1

은 ...

그러나, 단지 참고하시기 바랍니다 ... 난 2010

Nullable<int> status = 0; 
    String username = "Alexandre 2"; 

    var test = _context.Contacts.SingleOrDefault(c => c.FirstName == username && (!status.HasValue || c.ContactID == 1)); 

내가 오류를 얻을와 VS의 다음 행에 아무런 문제가 없을 것 같습니다 연락처 개체 내가 기대하는 반환 ... 그래서 아무것도, 그것은 당신의 user.statusID 필드의 유형이 궁금 무엇입니까?

최고 행운

+0

EF 4와 관련이 있습니까? – GONeale