亚音速查询,以确定值是否以数字开头
本文关键字:是否 数字 开头 查询 亚音速 | 更新日期: 2023-09-27 17:53:58
这是这个问题的后续问题,但是上下文已经改变了。打破公认的解决方案
这次我试图使用SubSonic,但它使用先前接受的解决方案抛出错误消息
System.NotSupportedException: The method 'get_Chars' is not supported
...
Line 36: char[] nums = "0123456789".ToCharArray();
Line 37:
Line 38: var b = repository.GetAll().Where(q => nums.Contains(q.BrukerIdent[0])).ToList();
Line 39:
Line 40:
据我所知,q.BrukerIdent
是一个字符串。
忘记LINQ -不要使用它。有更好的方法来实现你的目标。使用SQL。如果你只是使用SQL,你就已经完成了 -它只是一个基本的模式搜索。
亚音速吗?使用CodingHorror
并使用适当的SQL。
CodingHorror
是SubSonic组件中的一个类。它为您提供了一种执行特定的、手工编写的SQL的方法,在这些实例中,试图用LINQ实现相同的结果是困难的,如果不是不可能的话,因此完全浪费时间。
您还可以执行CodingHorror
查询,并要求它将结果作为强类型对象的列表提供给您。
CodingHorror的一个用法应该可以解决你的问题,但是你必须填写一些细节(表名,类型名)。
var query = new CodingHorror(@"SELECT * FROM YourTableHere
WHERE BrukerIdent LIKE '[a-z0-9]%'");
var matchingItems = query.ExecuteTypedList<YourTypeHere>();
此外,使用亚音速甚至更大的ORM也有一些流失。我建议你看看PetaPoco(或者Massive或Dapper,等等)。PetaPoco的作者是由于他在使用SubSonic的项目中经常使用CodingHorror
的经验所驱动的。
您是否尝试过使用Substring
而不是字符索引器?
string[] nums = new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };
var b = repository.GetAll().Where(q => nums.Contains(q.BrukerIdent.Substring(0, 1))).ToList()
注意我必须使nums
为字符串[]而不是char[],因为Substring()返回的是字符串而不是char。
如果运行仍然有问题,有时SubSonic喜欢将.Contains()
被调用的对象改为IEnumerable,所以你可能必须这样做:
var nums = (new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" }).AsEnumerable();
您是否尝试在不使用lambda函数和其他东西的情况下查看问题所在?
需要将linq表达式转换为有效的sql表达式。
在我看来,方法getChars(对q.BrukerIdent
的索引器)是不支持在IQueryableProvider你使用。