按 NHibernate/LINQ 中其他两个字段的组合/函数的字段排序
Posted
技术标签:
【中文标题】按 NHibernate/LINQ 中其他两个字段的组合/函数的字段排序【英文标题】:Ordering by a Field that's a combination/function of two other fields in 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())
??
【参考方案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))" />
然后您可以通过linq-to-nhibernate订购:
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# 代码中处理排序。以上是关于按 NHibernate/LINQ 中其他两个字段的组合/函数的字段排序的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate LINQ 是不是稳定并且项目上的所有 NHibernate 螺栓都允许它
在 NHibernate 3.0 Linq 中急切加载多个兄弟姐妹和孙辈(堂兄弟?)的良好行为
NHibernate Linq 提供程序中的 Fetch 与 FetchMany