【问题标题】:LastIndexOf in LINQ to EntitiesLINQ to Entities 中的 LastIndexOf
【发布时间】:2014-01-15 22:49:20
【问题描述】:

我正在使用 LINQ to Entities 从 MSSQL 数据库中获取元素,我需要按字符串的最后一个索引对它们进行排序:

var data = db.GetEntities().
           OrderBy(e=>e.StringProperty.LastIndexOf("Foo")).ToList()

但是,LINQ to Entities 不支持LastIndexOf。我试过搜索类似的问题,但我发现的只是this,它不能解决我的问题(订购)。在 MSDN 上搜索没有得到任何结果。

使用 LINQ to Entities 完成此任务的最简单方法是什么(我不想在 ToList()) 之后执行此操作。

【问题讨论】:

    标签: c# sql-server linq entity-framework linq-to-entities


    【解决方案1】:

    你可以试试

    OrderBy(e => e.StringProperty.Length - EntityFunctions.Reverse(e.StringProperty).IndexOf("ooF"))
    

    我认为支持ReverseIndexOf

    【讨论】:

    • 我认为你需要使用EntityFunctions.Reverse
    • @James 谢谢,普通的Reverse 给你一个IEnumerable<char>,这没什么用:)
    • 如果没有找到字符串,结果将是长度,而不是零。但否则很好的解决方案。
    • 我的意思是-1,如果找不到字符串,则不是零。
    • @MarcelDevG 你是对的,虽然我确信这不是太难解决:)
    【解决方案2】:

    使用 LINQ to Objects 进行排序

    var data = db.GetEntities()
        .AsEnumerable()
        .OrderBy(e => e.StringProperty.LastIndexOf("Foo"))
        .ToList();
    

    使用AsEnumerable 将允许您保留延迟执行,这是比调用ToList然后执行OrderBy 更好的折衷方案。

    【讨论】:

    • 这完全没有抓住重点——OP 专门询问了I don't want to have to do this after the ToList(),这意味着他不想枚举实体。这错过了 EF 的重点
    • @BenjaminGruenbaum 我想你可能误解了AsEnumerable 的工作原理,它不枚举实体,查询仍然只在ToList 被调用时才被评估......
    • 但是排序将在客户端,而不是在服务器上
    • @MarcelDevG 是的,但是,这并不总是一个坏主意,EF 受到数据库的限制,因此有时无法在服务器端完成复杂的查询。如果不是海量数据,我真的看不出问题出在哪里。
    • @James,没错,如果它只是排序,在某些情况下甚至更可取。但是如果你结合 where 子句,我不会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多