1

LINQ to DataSetを使用してデータを取得およびフィルター処理する、厳密に型指定されたDataSet大文字と小文字の区別に関する問題が発生しています。サンプル プロジェクトでは、DataSet1 という厳密に型指定された DataSet を作成しました。これには、 Customersという単一の名前が含まれています。インスタンス化して入力するために、いくつかの行を作成します (名前の大文字と小文字に注意してください)。DataTable

// Instantiate
DataSet1 ds = new DataSet1();

// Insert data
ds.Customers.AddCustomersRow(1, "Smith", "John");
ds.Customers.AddCustomersRow(2, "SMith", "Jane");

Select次に、DataSet の組み込み機能を使用して、簡単にフェッチ/フィルター処理できます。

var res1 = ds.Customers.Select("LastName LIKE 'sm%'");
Console.WriteLine("DataSet Select: {0}", res1.Length);

DataSet Select: 2

問題は、LINQ to DataSet を使用して同じ操作を実行しようとしたときに始まります。

var res2 = from c in ds.Customers where c.LastName.StartsWith("sm") select c;
Console.WriteLine("LINQ to DataSet: {0}", res2.Count());
LINQ to DataSet: 0

インスタンス化された DataSet のCaseSensitiveプロパティと Customer DataTable のCaseSensitiveプロパティを既に確認しましたが、どちらも false です。Selectまた、この方法論を使用するDataSetと、 がフィルタリングを実行し、LINQ クエリが別のことを行っていることにも気付きました。

このタイプのコードに対する私の希望と願望は、それを使用してコンパイル済みの LINQ to SQLクエリを単体テストすることでした。そのため、現在使用しているすべてのクエリを実際に変更することはできません。

...where c.LastName.StartsWith("sm", StringComparison.CurrentCultureIgnoreCase) select c;

...それはSQLのクエリを変更します。提案をありがとう!

4

2 に答える 2

1

LINQ to DataSet では、標準String.StartsWithメソッドを含む通常のマネージ関数が引き続き使用されます。これらのメソッドが DataTable のプロパティ
を認識することは基本的に不可能です。CaseSensitive

代わりに、ExpressionVisitor を使用して、すべてのStartsWith(または同様の) 呼び出しを passに変更できますStringComparison.CurrentCultureIgnoreCase

于 2011-12-19T22:39:46.427 に答える
0

c.LastName.ToLower().StartsWith("sm"小文字のエントリも確実に取得できるようにするために使用することもできます。幸運を!

于 2011-12-20T15:10:12.130 に答える