Tôi có một danh sách tất cả các tiền tố tên tài khoản riêng biệt (az) mà tôi có được sử dụnggroupby SqlFunction trên QueryOver
var accounts = this.SessionManager.GetActiveSession().QueryOver<Account>();
var q = accounts.Select(Projections.Distinct(
Projections.SqlFunction("substring",
NHibernateUtil.String,
Projections.Property("Name"),
Projections.Constant(1),
Projections.Constant(1))));
Tuy nhiên những gì tôi muốn làm là thay vì trả lại một danh sách riêng biệt là nhóm các tiền tố và trở lại số lượng tài khoản bắt đầu bằng tiền tố đó, nhưng tôi không chắc chắn cách thực hiện một nhóm bằng cách sử dụng truy vấn vì nó không đơn giản như là LINQ chuẩn.
Lý do tôi đang sử dụng QueryOver và không truy vấn là vì một số lý do chức năng chuỗi con đang được thực hiện trong bộ nhớ chứ không phải trên máy chủ cơ sở dữ liệu.
Đây là cách tôi thường sẽ làm điều đó
var prefixes = (from acc in this.SessionManager.GetActiveSession().Query<Account>()
group acc by acc.Name.Substring(0, 1)
into grp
select new
{
Prefix = grp.Key,
Count = grp.Count()
});
Sửa Đây là những gì tôi đã cố gắng nhưng tôi nhận được lỗi sau
Không nhận dạng được gọi phương thức trong biểu SqlFunction ("chuỗi con ", NHibernateUtil.String, new [] {Property (" Name "), Constant (Convert (1)), Constant (Convert (1))})
var accounts = this.SessionManager.GetActiveSession().QueryOver<Account>().Select(
Projections.Group<string>(x => Projections.SqlFunction("substring", NHibernateUtil.String,
Projections.Property("Name"), Projections.Constant(1),
Projections.Constant(1))),
Projections.Count<string>(x => Projections.SqlFunction("substring", NHibernateUtil.String,
Projections.Property("Name"), Projections.Constant(1),
Projections.Constant(1)))
);
Chức năng chuỗi con cần thêm một tham số nhưng điều này giải quyết được vấn đề. Nhiều người cảm ơn – JConstantine