LINQ;搜索文化不变

时间:2011-03-28 13:48:51

标签: c# linq c#-4.0 llblgenpro


这是我的问题。我们有一个企业,用户或任何东西的列表,我们必须使用“StartsWith”搜索类型搜索它。所以在我们的网站上,我们没有像Textbox这样的搜索字段,但我们有一个搜索标题包括27个按钮“#”,“A”,“B”,“C”,[...]“ Z”。

我们遇到的问题是,如果用户点击“E”按钮,当我们查询从数据库获取价值时,企业名称可以以“É”,“È”,“Ê”开头,因为是的,我们的网站是法语。任何想法如何在LINQ中做到这一点。

重要的是要知道我们正在使用LLBLGen Pro。所以我想它需要有一些东西可以转换成有效的SQL查询。

以下是我们已经尝试过的内容:

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

相对于不可转换的查询,这给了我们这个错误: Unable to cast object of type 'System.Linq.Expressions.ConstantExpression' to type 'SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SetExpression'.

所以我们尝试使用一个简单的LINQ查询使其基本化,而不向DB询问是否可能。

IList<string> test = new List<string>() { "École", "enlever", "avoir" };
IList<string> result = (from value in test
                        where "eéèêë".Contains(value[0].ToString())
                        select value).ToList();

这个查询的奇怪之处在于它不会崩溃。但是,它也不起作用!在调试时,它会经历它,但是当我们试图查看“结果”列表中的内容时,就好像它中没有任何内容。我的意思是,列表只是null。但尝试捕获没有任何失败!

请帮忙!

5 个答案:

答案 0 :(得分:1)

真正的解决方案是在数据库中为可搜索的名称创建一个额外的列,因此每当您添加新公司时,您还会向可搜索的名称列添加值。您可以将所有字符转换为高位(或更低,如果您愿意)不变,并将“干净”名称添加到可搜索名称列。此时您也可以删除标点符号,因为搜索通常很麻烦。

这将为您留下一个您永远不会显示的列,但在此列中搜索匹配将更容易(也更快),因为您在搜索时无需担心重音字符。

答案 1 :(得分:0)

只需使用字符串

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

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

答案 2 :(得分:0)

如果我能帮到你,那就是你想要的:

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

答案 3 :(得分:0)

Any似乎无法正常工作。请改用Contains。这是有效的。

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

答案 4 :(得分: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,您只需将“e”传递给查询。