2012-01-27 2 views
2

데이터베이스 테이블에 대한 텍스트 검색을 구현하려고합니다. 나는 일반적인 저장소를 가지고 있으며 데이터베이스에 꽤 많은 것이 있기 때문에 노출하고자하는 모든 모델에 대해 파생 된 저장소를 만들지는 않으려 고합니다.Entity Framework의 일반 형식에 대한 텍스트 검색

var props = typeof(T).GetProperties() 
    .Where(p => p.PropertyType == typeof(string)); 

IEnumerable<T> searched = null; 
if (!string.IsNullOrWhiteSpace(searchTerm)) 
    searched = sorted.Where(c => props 
     .Select(p => (string)p.GetValue(c, null)) 
     .Select(v => v.Contains(searchTerm)) 
     .Contains(true)); 

나는이 약간의 반사를 통해 얻은 PropertyInfo의 모음 공급하고있어 다음과 같이

그래서 내가 함께 어려움을 겪고있어 코드입니다. 아마도 고성능 아이디어는 아니지만 아직 더 나은 방법을 생각해 보지 못했을 것입니다. 따라서 이들은 문자열의 모든 속성 (테이블의 모든 문자열 검색)이거나 사용자 정의 Searchable 속성이있는 특정 속성을 모델에서 가져올 수 있습니다.

내가 갖는 런타임 예외는 다음과 같습니다

NotSupportedException이 : 유형의 상수 값 'System.Reflection.PropertyInfo'을 만들 수 없습니다. 이 문맥에서는 원시 타입 (' Int32, String, Guid'등) 만 지원됩니다.

나는 리플렉션을 사용하고 있지만 정확히 여기서 예외를 일으키는 원인이 무엇인지 알 수 있습니다. 만약 누군가가 이것을 지적 할 수 있다면 그것은 많이 감사 하겠지만 누군가가 이것을 할 수있는 더 좋은 방법을 제안 할 수 있다면 놀라운 일이 될 것입니다. 미리 감사드립니다!

답변

1

LINQ 쿼리가 실행될 때 데이터베이스에서 수행 할 SQL 쿼리를 생성하려고 할 때 문제가 발생합니다. 예외 메시지는 SQL 쿼리로 성공적으로 변환 될 수있는 유일한 형식이기 때문에 LINQ 쿼리에서 기본 형식 만 사용할 수 있음을 나타냅니다.

문제를 해결하려면 비 기본형을 사용하여 LINQ 쿼리를 확장하기 전에 데이터베이스 SQL 쿼리가 실행되는지 확인해야합니다.

코드 조각의 변수가 LINQ 쿼리 인 것 같기 때문에 sorted.AsEnumerable()을 호출하여 데이터베이스에서 SQL 쿼리를 실행 한 다음 검색 기능을 수행 할 수 있습니다.

searched = sorted.AsEnumerable() 
       .Where(c => props.Select(p => (string)p.GetValue(c, null)) 
            .Any(v => v.Contains(searchTerm))); 
+0

답장을 보내 주셔서 감사합니다. 당신은 문제에 대해 정확하지만 솔루션은 내가 겪은 것이 아닙니다. where 절의 반영은 데이터베이스의 열을 필터링하기위한 것입니다. 필자가 정말로 필요로하는 것은 이것을 수행하는 리플렉션의 대안입니다. Up은 모두 똑같이 투표했습니다. :) –