2013-03-22 3 views
0

Func 표현식을 사용자 정의하여 그 내부의 바이트 배열을 확인해야합니다.이 배열이 POCO의 필드와 동일한 경우 true를 반환합니다. 그래서Linq where 절 내에서 사용자 정의 Func <> 위임

내가 그것을 정의하는 방법을 모른다 ...

public Patient GetPatientByIdentificationCode(byte[] bytes) 
    { 
     return DbSet.Where(Func<>).FirstOrDefault(); 
    } 

환자 바이트의 arrya 인 IdentificationCode ...

감사

PRI의에서
+0

'DbSet' 항목의 유형은 무엇입니까? 그것의 아이템 타입이'TSource' 델리게이트는'Func '타입이어야합니다. – sll

+0

그래서 -1 인 이유는 ... ... DbSet은 EF의 클래스입니다 : 생성, 읽기를 수행하는 데 사용되는 엔티티 세트를 나타냅니다 , 업데이트 및 삭제 작업을 수행합니다. DbSet 의 비 제네릭 버전으로, 작성시 엔티티 유형을 알 수 없을 때 사용할 수 있습니다 ... 설명해야합니까? –

답변

0

평등의 부분은 당신은 SequenceEqual 사용할 수 있습니다

return DbSet.Where(p => p.IdentificationCode.SequenceEqual(bytes)).FirstOrDefault(); 

을 순서는 중요하지 않습니다 경우 다음 요소가 동일하고 길이가 동일한 지 확인하실 수 있습니다 :

return DbSet.Where(p => 
       p.IdentificationCode.Length == bytes.Length && 
       p.IdentificationCode.Intersect(bytes).Count() == p.IdentificationCode.Length) 
      .FirstOrDefault(); 

그것은 가능성 바이트의 순서가 중요하지 않은 경우 SequenceEqual보다 느린 그렇게 밖에 이용 될 것입니다.

부수적으로, 실제 방법이나 확장 방법을 Patient에 작성하는 것이 좋습니다. LOT를 많이 사용하게 될 것입니다.

둘 중 하나를 사용하거나 바이트 배열보다 쉽게 ​​비교할 수있는 (표시 가능한) 형식으로 변경하십시오.

+0

개체 모델에서 메서드를 구현하는 것에 대해 제안 해 주셔서 감사합니다 ... –

1

있다 nciple 이런 식으로 작동해야합니다 :

return DbSet 
    .Where(i => i.IdentificationCode.Length == bytes.Length) 
    .FirstOrDefault(); 

우리가 어쩌면 더 도움이 될 수 있습니다. 특히 DbSetPatient의 모음인지 여부를 알 수 있습니다. 바이트의 순서 인 경우

+0

죄송합니다, 그렇습니다 그것은 Patient 컬렉션입니다 ...하지만 배열의 길이가 같지 않은지 검사해야합니다. 문제는 더 일반적인 것이지만 어떻게 Func <..> 변수를 정의 할 수 있습니까? Where 절 내부에서 재사용 할 수 있습니까? ... 감사합니다 ... –