0


これが私の問題です。企業やユーザーなどのリストがあり、「StartsWith」検索タイプで検索する必要があります。したがって、私たちのサイトには、テキストボックスなどの検索フィールドはありませんが、27個のボタン「#」、「A」、「B」、「C」、[...]"を含む検索ヘッダーがあります。 Z」。

私たちが抱えている問題は、ユーザーが「E」ボタンをクリックした場合、データベースから値を取得するためにクエリを実行すると、企業名が「É」、「È」、「Ê」で始まる場合があることです。そうです、私たちのサイトはフランス語です。 。LINQでそれを行う方法のアイデア。

これは、LLBLGenProを使用していることも知っておくことが重要です。したがって、彼が有効なSQLクエリに変換できるものが必要だと思います。

これが私たちがすでに試したことです:

IList<Enterprise>エンタープライズ;
スイッチ(searchChar){
  [...]
  ケース「E」:
     企業=ourContext.Enterprisesのentから
                   ここで、"eèéêë".Any(param => ent.name [0] == param)
                   entを選択します。
     壊す;
  [...]
}

これにより、このエラーは変換不可能なクエリと比較して何かが発生します。
Unable to cast object of type 'System.Linq.Expressions.ConstantExpression' to type 'SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SetExpression'.

そのため、DBにクエリを実行して可能かどうかを確認せずに、基本的に単純なLINQクエリを使用して作成しようとしました。

IList <string> test = new List <string>(){"École"、 "enlever"、 "avoir"};
IList <string> result =(テストの値から
                        ここで、「eéèêë」.Contains(value [0] .ToString())
                        値を選択).ToList();

このクエリの奇妙な点は、クラッシュしないことです。しかし、それも機能しません!デバッグするときはそれを通り抜けますが、「結果」リストに何が入っているかを確認しようとすると、何も入っていないようなものです。つまり、リストは単にnullです。しかし、トライキャッチに失敗するものはありません!

助けてください !

4

5 に答える 5

1

実際の解決策は、データベースに検索可能な名前の列を追加することです。したがって、新しい会社を追加するたびに、検索可能な名前の列にも値を追加します。すべての文字を上位(または必要に応じて下位)の不変文字に変換し、「クリーン」な名前を検索可能な名前の列に追加します。この時点で句読点を削除することもできます。これは、検索でしばしば苦痛になるためです。

これにより、表示されることのない列が残りますが、検索時にアクセント文字を気にする必要がないため、この列で一致するものを検索するのがはるかに簡単になります(また、はるかに高速になります)。

于 2011-03-28T14:12:24.647 に答える
0

文字列のStartsWithメソッドを使用するだけです

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

var result = test
    .Where(s => s.StartsWith("e", StringComparison.CurrentCultureIgnoreCase))
    .ToList();
于 2011-03-28T13:52:28.350 に答える
0

私があなたをここに連れてきたら、あなたが望むものです:

var result = test.Where(x => "eéèêë".Contains(Char.ToLowerInvariant(x.FirstOrDefault())));
于 2011-03-28T13:56:43.483 に答える
0

Anyが機能していないようです。代わりにContainsを使用してください。これは動作中です。

企業=ourContext.Enterprisesのentから
              ここで、「eèéêëEÈÉÊËE」.Contains(ent.name [0])
              entを選択します。
于 2011-03-28T14:13:44.997 に答える
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」を渡すだけで済みます。

于 2011-03-28T14:14:43.773 に答える