2013-09-25 2 views
0

int 배열이 속성 중 하나 인 클래스가 있다고합시다.엔티티의 Linq-to-SQL 쿼리 int 배열

public MyClass 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int[] Values { get; set; } 
} 

우리는 엔티티 프레임 워크를 사용하여 db에 저장합니다. 내가 알아챈 것은 EF가 Values ​​속성을 varchar (최대)로 변환한다는 것입니다.

지금 우리가 원하는 것은 '값'에 주어진 int 매개 변수가 들어있는 데이터베이스를 쿼리하고 레코드를 반환하는 것입니다.

public List<MyClass> Search(int valueToSearch) 
{ 
    return context.MyClasses.Where(x => x.Values.Contains(valueToSearch)).ToList(); 
} 

그러나 linq-to-sql이 contains 명령을 지원하지 않는다는 예외가 발생합니다.

나는 또한 Where(x => x.Values.Any(y => y == valueToSearch))을 시도했지만 동일한 예외가 발생합니다.

EF가 배열을 varchar로 바꿔서 contains 문이나 뭔가를 사용할 수 없게하는 것과 관련이 있다고 가정합니다. 어쩌면 값에 대한 별도의 테이블이 문제를 해결할 수는 있지만 정수 속성이 하나 뿐인 클래스를 만드는 것은 어리석은 것처럼 보입니까?

이 문제를 해결하는 더 좋은 방법이 있습니까?

나는 (SQL IN 문과 반대되는) 많은 예제를 발견했지만, 우리가 찾고있는 것은 아닙니다. 우리는 하나의 정수를 매개 변수로 가지고 있지만, 우리 엔티티에 여러 정수가 있습니다.

우리는 .NET 4.0에서 EF5를 사용하고 있습니다.

감사합니다.

편집

VARCHAR 우리가 우리 자신을 생성하는 문자열 보인다. 내가 직접 작성하지 않은 코드이므로, 나는 그 사실을 알지 못했습니다. 그 문자열은 varchar로 변환됩니다.

이제 질문은 '기본 유형의 배열을 저장하는 가장 좋은 방법은 무엇입니까?'와 같은 형식으로 변경됩니다. 그 질문은 이미 여기에 여러 번 대답했습니다 (그 중 하나가 코멘트에 제공됩니다).

+0

처음에는 괄호가 일치하지 않습니다 (valueToSearch 뒤에 닫는 괄호 여야 함). –

+4

매우 흥미 롭습니다. 정수 배열을 데이터베이스에 매핑하는 방법을 보여줄 수 있습니까? –

+2

'Values'에 대해 별도의 테이블을 만들어야한다고 생각합니다. –

답변

1

엔티티에 LINQ의 외부 쿼리를 수행합니다 (모든 행에 끌어가)

public List<MyClass> Search(int valueToSearch) 
{ 
    var c = context.MyClasses.ToList(); // cache 
    return c.Where(x => x.Values.Contains(valueToSearch)); 
} 

편집 : 현재 수동으로 문자열로 정수의 배열을 변환하는 경우, 당신의 클래스를 변경 속성을 정수 배열에서 문자열로 변환합니다.

비록 새 테이블을 사용하는 것이 좋습니다. db 필드에있는 문자열의 정수 배열은 약간의 냄새가 난다.

+0

값을 저장하기 위해 다른 테이블을 생성해야합니다. 작은 데이터 세트에는 효과적 일 수 있지만 클라이언트가 더 많은 데이터를 가져 오는 경우에는 어떨까요? 초기 개발 과정에서 프로젝트가 진행되었지만 일단 클라이언트가 380 만 개 항목을 가져 오면이 항목이 폭발하여 데이터를로드하기 전에 데이터를 필터링해야만 원하는 데이터가 있는지 확인할 수있었습니다. – MBentley

+0

참. 솔루션에 대한 답변을 게시하십시오. –