2011-03-28 4 views
0


여기 내 문제입니다. 우리는 기업, 사용자 또는 기타 목록을 가지고 있으며 "StartsWith"검색 유형으로 검색해야합니다. 그래서 우리 사이트에는 Textbox와 같은 검색 필드가 없지만 27 개의 버튼 "#", "A", "B", "C", [...] "가 포함 된 검색 헤더가 있습니다. 지".LINQ; 문화 불변과 검색

"E"버튼을 클릭하면 데이터베이스에서 값을 가져 오기 위해 쿼리 할 때 entreprises 이름이 "É", "È", "Ê"로 시작될 수 있습니다. 사이트는 프랑스어로되어 있습니다. LINQ에서 수행하는 방법에 대한 아이디어.

우리가 LLBLGen Pro를 사용하고 있음을 아는 것도 중요합니다. 그래서 그는 그것이 유효한 SQL Query로 변환 할 수있는 것이 필요하다고 생각합니다. Unable to cast object of type 'System.Linq.Expressions.ConstantExpression' to type 'SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SetExpression'.


그래서 우리가 함께 이것은 기본적를 만들기 위해 시도했다 : 우리에게 unconvertable 질의에 상대적으로이 오류 무언가를 제공

 
IList<Enterprise> enterprises; 
switch (searchChar){ 
    [...] 
    case "E": 
    enterprises = from ent in ourContext.Enterprises 
        where "eèéêë".Any(param => ent.name[0] == param) 
        select ent; 
    break; 
    [...] 
} 

을 : 여기

은 우리가 이미 tryied 한 것입니다 가능하면 DB에 쿼리하지 않고 간단한 LINQ 쿼리.

이 쿼리에 이상한 점은 충돌이 발생하지 않는다는 것입니다. 그러나, 그것은 또한 작동하지 않습니다! 디버깅 할 때, 그것을 통과하지만, 우리가 "결과"목록에 무엇이 있는지 알아 내려고 시도 할 때 아무 것도없는 것처럼 보입니다. 목록이 단순히 null이라는 뜻입니다. 그러나 아무 것도 시도 잡기에 실패하지 않습니다!

도와주세요! 내가 여기 당신을 가지고있는 경우

답변

0

Any가 작동하지 않는 것 같습니다. 대신 Contains를 사용하십시오. 이것은 일하고 있습니다.

 
enterprises = from ent in ourContext.Enterprises 
       where "eèéêëEÈÉÊËE".Contains(ent.name[0]) 
       select ent; 
0

그냥 문자열

IList<string> test = new List<string>() { "École", "enlever", "avoir" }; 

var result = test 
    .Where(s => s.StartsWith("e", StringComparison.CurrentCultureIgnoreCase)) 
    .ToList(); 
+0

네, 단순한 LINQ 쿼리로이 작업을 수행했습니다.그러나 첫 번째 쿼리 (LLBLGen)를 사용하여이를 수행 할 때 유효한 SQL 쿼리로 변환 할 수 없습니다! –

+0

@ Simon LLBL을 바이 패스하여 직접 쿼리를 생성 할 수 있습니다. 어떤 이유로 LLBL은 그 프레임 워크에서 그렇게하기가 어리석게 어렵게 만들었습니다. –

+0

죄송 합니다만 사실이 아니며 정상적으로 작동하지만 양호한 값을 반환하지 않습니다. –

0

의 StartsWith 방법을 당신이 원하는 무엇을 사용

var result = test.Where(x => "eéèêë".Contains(Char.ToLowerInvariant(x.FirstOrDefault()))); 
+0

단순히 "eeèêë"가 아닌가? (value [0] .ToString())? –

+0

맞습니다. 샘플을 업데이트했습니다. – UserControl

1

진짜 해결책은 여기에 데이터베이스에 추가 열을 만드는 것입니다 검색 가능한 이름은 새 회사를 추가 할 때마다 검색 가능한 이름 열에도 값을 추가합니다. 모든 문자를 상한 (또는 원하는 경우 더 낮은) 불변으로 변환하고 검색 가능한 이름 열에 "깨끗한"이름을 추가하십시오. 검색시 고통이되기 때문에 구두점을 제거 할 수도 있습니다.

이렇게하면 열이 표시되지 않지만 검색시 악센트 부호가있는 문자를 걱정할 필요가 없으므로이 열의 일치 항목을 찾는 것이 훨씬 쉽고 훨씬 빠릅니다.

+0

그런 생각은하지 않았지만 이것은 좋은 생각입니다. 이미 존재하는 데이터가있는 시스템이기 때문에이 작업을 수행 할 수 없습니다. 그러나 미래에, 이것은 사려 될 것입니다. –

+0

검색 문자열과 해당 원본 테이블에 대한 ForignKey를 사용하여 추가 테이블을 만들 수 있습니다. –

0

난 당신이 데이터베이스에 대한 제어가 있는지 확실하지 않다, 당신이 사용하는 RDMBS하는,하지만 쉬운 방법은 쿼리의 대소 문자를 구분, 악센트를 구분 데이터 정렬을 사용하는 것 -이 방법은 SQL 열심히 일한다.

-- Assuming that your existing table is Accent Sensitive 
create table Enterprises 
(
name nvarchar(200) collate SQL_Latin1_General_CP1_CI_AS 
) 
GO 

-- We can still use an Accent Insensitive View 
create view vEnterprises 
as 
    select name collate SQL_Latin1_General_CP1_CI_AI AS name 
     from Enterprises 

GO 

insert into Enterprises values ('e') 
insert into Enterprises values ('è') 
insert into Enterprises values ('é') 
insert into Enterprises values ('ê') 
insert into Enterprises values ('ë') 

insert into Enterprises values ('E') 
insert into Enterprises values ('É') 
insert into Enterprises values ('È') 
insert into Enterprises values ('Ê') 


-- returns 'e' and 'E' 
select * from Enterprises where name like 'e%' 

-- returns everything 
select * from vEnterprises where name like 'e%' 

은 방금 쿼리에 '전자'를 통과 할 수 LLBLGen에 악센트를 구분보기를 추가 할 수 있다고 가정.

+0

감사합니다. 우리는 데이터베이스에 대한 모든 권한을 가지고 있지 않습니다. 그래서 우리가이 일을 할 수 없다는 것을 확신하지 못합니다. 이 답변을 게시하는 동시에 응답을하고이를 수행 할 방법을 찾았습니다. 그러나 다른 프로젝트에서 더 필요하다면 이것은 고려 될 것입니다. –