【问题标题】:Subsonic query to determine if value starts with numeric亚音速查询以确定值是否以数字开头
【发布时间】:2011-04-29 08:14:56
【问题描述】:

这是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 是一个字符串。所以我有点被扔了...

【问题讨论】:

    标签: c# .net linq subsonic


    【解决方案1】:

    忘记 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 的经验所驱使。

    【讨论】:

    • 两张反对票,真的吗?也许我会删除它,因为它显然没有帮助。
    • 我改为赞成。你原来的答案真的很尖刻。
    • @rossisdead:是的,我今天感觉很恶毒。谢谢你怂恿我让它变得更好。 ;-)
    【解决方案2】:

    您是否尝试过使用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 设为 string[] 而不是 char[],因为 Substring() 返回的是字符串而不是 char。

    如果运行仍然有问题,有时 SubSonic 喜欢将 .Contains() 调用为 IEnumerable 的对象,因此您可能必须这样做:

    var nums = (new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" }).AsEnumerable();
    

    【讨论】:

      【解决方案3】:

      您是否尝试在不使用 lambda 函数和其他东西的情况下完成它以查看问题出在哪里?

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-08-18
          • 2023-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-02
          • 2012-01-22
          • 1970-01-01
          相关资源
          最近更新 更多