1

我正在尝试查找帐户名称的前缀,以便可以在 UI 的过滤器中使用它们。

但是,每当我执行以下 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;
}
4

1 回答 1

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)完成

于 2012-05-28T18:30:51.723 回答