【问题标题】:Sql order by < string in linq to entity frameworkSql order by < string in linq to entity framework
【发布时间】:2014-04-25 19:57:29
【问题描述】:

如何在 Linq (lambda) to Entity Framework 中执行此查询。

select * from table where name like '%someString%' order by name <'someString', name

假设我在服务器上有这些数据:

aba
baa

按“%ba%”查询

if I order by name the result will be :
aba - baa

if I order < name the result will be :
baa - aba (which is desired)

【问题讨论】:

    标签: mysql linq entity-framework


    【解决方案1】:

    aString.CompareTo(anOtherString) &lt; 0 在 SQL 中被翻译为aString &lt; anOtherString(至少由 Sql Server 提供程序,可能也在 MySql 中,希望你幸运)。所以在你的情况下,它会是

    from t in context.Table
    where t.name.Contains(someString)
    orderby (t.name.CompareTo(someString) < 0), t.name
    select t
    

    (礼貌 p.campbell 将其撞回首页)。

    【讨论】:

    • 是的,如果 EF 可以为此操作转换到 MySQL,则使用 CompareTo() 将产生相同的结果。 Gert,感谢您提醒 CompareTo() :) dotnetfiddle.net/7tjRS0
    【解决方案2】:

    如果我理解正确的话,您正在使用 Entity Framework 来查询 MySQL 数据库表。

    一种解决方案是创建一个匿名对象,其中包含您的实体及其排序分数。当然用你的实体替换Table

    var matches = DataContext.Table
                   .Where(x=>x.Name.Contains(searchToken))
                   .Select(x=> new {Table = x, 
                                    Score = (x.Name.StartsWith(searchToken))})
                   .OrderByDescending(x=>x.Score)
                   .ThenBy(x=>x.Emp.Name);
    

    这是.NET Fiddle demonstrating

    【讨论】:

    • 您理解正确,但查询是order by name &lt;'someString' 而不是order by name 'someString' 注意&lt; 字符
    • 它按以该字符串开头的文本排序,不确定完整的算法。对自动完成部分搜索的结果进行排序很有用。提供示例的已编辑问题。
    • StartsWith 不是一个选项,因为我有多个世界,例如:Bart Calixto,我想查找Calixto。如果我使用 like 'word%' 则找不到。
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 2020-05-21
    • 1970-01-01
    • 2012-07-18
    • 2016-05-26
    • 2011-04-18
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多