2011-12-19 14 views
1

大文字と小文字を区別する強い形式のDataSetには、LINQ to DataSetを使用してデータの取得とフィルタリングに問題があります。私のサンプルプロジェクトでは、DataSet1という厳密に型指定されたDataSetを作成しました。これには、Customersと呼ばれる単一のDataTableが含まれています。インスタンス化および移入するには、私は、行のカップル(気づく名のケーシング)を作成:大文字と小文字を区別するLINQ to DataSet

// Instantiate 
DataSet1 ds = new DataSet1(); 

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

次に、私は簡単に取得することができます/使用してフィルタをデータセットの内蔵Select機能:

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

DataSet Select: 2 

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 

私は既にインスタンスデータセットのCaseSensitiveチェックしました:同じ操作を実行するためにデータセットにLINQを使用しようとしたとき

トラブルが始まりますプロパティとCustomer DataTableのCaseSensitiveプロパティの両方がfalseです。また、Select方法を使用すると、DataSetがフィルタリングを実行し、LINQクエリが別の処理を実行していることも認識しています。それが変わるよう

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

を...:コードのこのタイプの

私の希望と欲望は、私が実際に使用するために、現在のすべてのクエリを変更することはできませんので、ユニットテストに私たちのCompiled LINQ to SQLクエリを、それを使用していましたSQLのクエリご意見ありがとうございました!

答えて

1

LINQ to DataSetsは、標準のString.StartsWithメソッドを含む通常の管理機能を引き続き使用します。
これらのメソッドでは、DataTableのCaseSensitiveプロパティを認識することは基本的に不可能です。

代わりに、ExpressionVisitorを使用してStartsWith(または類似の)呼び出しをすべてStringComparison.CurrentCultureIgnoreCaseに渡すことができます。

+0

私はこれが私が探していると思います!だから、 'ExpressionVisitor'は、私が式を交換することを可能にしますか?私はトピック[リンク] http://msdn.microsoft.com/en-us/library/bb882521%28v=vs.90%29.aspx –

0

また、c.LastName.ToLower().StartsWith("sm"を使用すると、ケース入りの低いエントリも確実に取得できます。がんばろう!

+0

Younesのお返事ありがとうございます。この質問を読んだら、元のクエリを変更することはできませんが、大文字と小文字を区別しないSQL ServerデータベースをターゲットとするSQLクエリには実際にLinqを使用しているためです。私はユニットテストのためにDataSetsを使用したいと考えています。 –

関連する問題