【问题标题】:Ordering by a Field that's a combination/function of two other fields in NHibernate/LINQ按 NHibernate/LINQ 中其他两个字段的组合/函数的字段排序
【发布时间】:2016-09-12 20:37:03
【问题描述】:

假设我有以下...

public class User
{
    public virtual string FirstName {get; set;}
    public virtual string LastName {get; set;}

    public virtual string LastNameFirst 
    get
    {
         return LastName.Trim() + ", " + FirstName.Trim();
    }

    protected set
    {
         /*Left empty...*/
    }
}

在我的 UserMap.cs 类中,我有以下内容...

Map(x => x.FirstName).Column("FirstName").Not.Nullable().Length(255);
Map(x => x.LastName).Column("LastName").Not.Nullable().Length(255);

是否有可能以某种方式配置它以便我可以调用...

var orderedUsers = users.OrderBy(i => i.LastNameFirst).ToList()

当我尝试这个时,我得到“无法解析属性:LastNameFirst”。

【问题讨论】:

  • 你可以试试users.OrderBy(i => i.LastName.Trim() + ", " + i.FirstName.Trim()) ??

标签: c# sql linq nhibernate


【解决方案1】:

要么使用Juan Carlos proposition

var orderedUsers = users.OrderBy(
    i => i.LastName.Trim() + ", " + i.FirstName.Trim()).ToList();

或链式排序,这取决于您的数据,可能适合您的需求,尽管它可能与您的字符串连接/修剪的排序不同:

 var orderedUsers = users.OrderBy(
     i => i.LastName.Trim()).ThenBy(i => i.FirstName.Trim()).ToList();

否则,将您的 LastNameFirst 映射为 SQL 公式(例如,我没有使用 Fluent 或 map-by-code,但我知道它们也可以使用公式;假设 SQL-Server,如果有的话,请调整语法否则):

<property name="LastNameFirst"
  formula="ltrim(rtrim(LastName)) + N', ' + ltrim(rtrim(FirstName))" />

然后您可以通过订购:

var orderedUsers = users.OrderBy(i => i.LastNameFirst).ToList();

【讨论】:

    【解决方案2】:

    如果用户是 IQueryable

    试试这个

    var orderedUsers = users.AsEnumerable().OrderBy(i => i.LastNameFirst).ToList();

    var orderedUsers = users.ToList().OrderBy(i => i.LastNameFirst);

    【讨论】:

    • 哇...这工作。你能解释一下它是如何工作的或它在做什么的逻辑吗?它是建立一个内存列表还是什么?我唯一担心的是有很多记录,所以我正在做一些分页和过滤——我希望从数据库/SQL 中完成。
    • 是的,这是在内存中。它实际上不能用于替换应该发生在数据库端的查询的排序。如果有大量数据,分页数据库端,这将导致问题...
    • 这不是最佳解决方案,因为当您处理大型表时,此解决方案会从表中加载所有行并在 c# 代码中处理排序。
    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多