区分大小写LINQ to DataSet

时间:2011-12-19 22:34:45

标签: unit-testing ado.net case-sensitive linq-to-dataset

我遇到一个强类型DataSet使用LINQ to DataSet来表示区分大小写以检索和过滤数据的问题。在我的示例项目中,我创建了一个名为DataSet1的强类型DataSet。它包含一个名为Customers的DataTable个。为了实例化和填充,我创建了几行(注意名称上的大小写):

// Instantiate
DataSet1 ds = new DataSet1();

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

接下来,我可以使用DataSet的内置Select功能轻松获取/过滤:

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查询正在执行其他操作。

我对这类代码的希望和期望是使用它来对我们的Compiled LINQ to SQL查询进行单元测试,这样我就无法真正改变所有当前使用的查询:

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

...因为它改变了SQL中的查询。谢谢大家的任何建议!

2 个答案:

答案 0 :(得分:1)

LINQ to DataSets仍然使用普通的托管函数,包括标准的String.StartsWith方法 从根本上讲,这些方法不可能知道DataTable的CaseSensitive属性。

相反,您可以使用ExpressionVisitor更改所有StartsWith(或类似)调用以传递StringComparison.CurrentCultureIgnoreCase

答案 1 :(得分:0)

您还可以使用c.LastName.ToLower().StartsWith("sm",这样可以确保您还可以检索较低的套装条目。祝你好运!