亚音速查询,以确定值是否以数字开头

本文关键字:是否 数字 开头 查询 亚音速 | 更新日期: 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你使用。