我正在尝试查找我的帐户名称的前缀,以便我可以在我的用户界面中使用它们。
但是每当我执行以下linq语句时,它总是会返回整个帐户名,然后执行子字符串。而不是写sql等价。
return this.Accounts(user).Select(x => x.Name.Substring(0, 1)).ToList().Distinct();
this.Accounts是IQueryable,因此它不应强制回调数据库。
是否有任何理由将它们全部返回,然后对结果名称进行子串,或者是否有可行的替代方案?
修改
private IQueryable<Account> Accounts(User user)
{
var accounts = this.SessionManager.GetActiveSession().Query<Account>().Where(x => x.Company.Id == user.Company.Id);
if (!user.IsAdmin && user.AccountProfiles.Any())
{
accounts = accounts.Where(x => x.AssociatedProfiles.Any(y => y.Users.Any(z => z.Id == user.Id)));
}
return accounts;
}
答案 0 :(得分:1)
我创建了一个只包含Account
属性的简单string Name
类。
您在session.Query<Account>()
上执行的第一个块会导致SQL期望:
select
substring(account0_.Name,
@p0+1,
@p1) as col_0_0_
from
Account account0_;
@p0 = 0 [Type: Int32 (0)],
@p1 = 1 [Type: Int32 (0)]
值得注意的是,在Distinct()
电话之后,ToList()
已离开。否则,你会得到更好的东西:
select
distinct substring(account0_.Name,
@p0+1,
@p1) as col_0_0_
from
Account account0_;
@p0 = 0 [Type: Int32 (0)],
@p1 = 1 [Type: Int32 (0)]
我的建议是将Accounts(User)
方法简化为单个语句:
return SessionManager.GetActiveSession().Query<Account>();
...然后开始添加其余内容直到失败。
附注:使用最新的NHibernate稳定版本(截至目前为3.3.0)完成所有测试