我遇到一个强类型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中的查询。谢谢大家的任何建议!
答案 0 :(得分:1)
LINQ to DataSets仍然使用普通的托管函数,包括标准的String.StartsWith
方法
从根本上讲,这些方法不可能知道DataTable的CaseSensitive
属性。
相反,您可以使用ExpressionVisitor更改所有StartsWith
(或类似)调用以传递StringComparison.CurrentCultureIgnoreCase
。
答案 1 :(得分:0)
您还可以使用c.LastName.ToLower().StartsWith("sm"
,这样可以确保您还可以检索较低的套装条目。祝你好运!