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

时间:2011-04-29 08:14:57

标签: c# .net linq subsonic

这是this问题的后续行动,但背景已发生变化。打破已接受的解决方案。

这次我正在尝试使用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是一个字符串。所以我有点抛出......

4 个答案:

答案 0 :(得分:2)

忘记LINQ - 不要使用它。有一种更好的方法来实现您的目标。使用SQL。如果你刚刚使用SQL,那么你已经已经了 - 它只是一个basic pattern search

亚音速?使用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>();

此外,使用SubSonic还有一些外流,一般来说甚至更大的ORM。我建议查看PetaPoco(或Massive或Dapper等)。 PetaPoco的作者受到他在使用SubSonic的项目中经常使用CodingHorror的经验的驱使。

答案 1 :(得分:1)

您是否尝试过使用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();

答案 2 :(得分:0)

你是否试图在不使用lambda函数和其他东西的情况下制作它以查看问题所在?

答案 3 :(得分:0)

需要将linq表达式转换为有效的sql表达式。

在我看来,您使用的IQueryableProvider不支持getChars方法(q.BrukerIdent上的索引器)。