c# - nhibernate - queryover - 如何对连接查询进行动态排序

标签 c# nhibernate fluent-nhibernate queryover

我在管理面板中有一个用户帐户表,该表包含来自不同数据库表(SQL 数据库中的表)的数据。并且用户帐户表必须支持分页和排序。当我尝试使用从 Account db 表中获取的“FirstName”对数据进行排序时,.net 抛出一个异常,指出 Location db 表没有“FirstName”列。我的方法是这样的:

        Account acc = null; //bunu bu şekilde tanımlamadan olmuyor :S
        AccountLogin accl = null; //bunu bu şekilde tanımlamadan olmuyor :S
        Program prog = null;
        Location school = null;
        Location town = null;
        Location city = null;

        //Takip edilen bloggerın tüm blog sayfalarını çek
        var query = Session.QueryOver<Account>(() => acc)
            .Left.JoinQueryOver<AccountLogin>(x => x.Logins, () => accl)
            .Left.JoinQueryOver(x => acc.AtentedToProgram, () => prog)
            .Left.JoinQueryOver(x => acc.LiveIn, () => school)
            .Left.JoinQueryOver(x => school.Parent, () => town)
            .Left.JoinQueryOver(x => town.Parent, () => city)
            .Where(x =>                                   acc.CreateDate.IsBetween(DateTime.Now.AddMonths(-12)).And(DateTime.Now)
                   );

        if (program_id != 0)
            query.And(x => prog.program_id == program_id);

        search = search??"";

        string[] searchedTags = search.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

        if (searchedTags != null && searchedTags.Count() > 0)
        {
            Disjunction dis = new Disjunction();

            for (int i = 0; i < searchedTags.Count(); i++)
            {
                dis.Add(Expression.Like(Projections.Property(() => accl.UserName), searchedTags[i], MatchMode.Anywhere));
                dis.Add(Expression.Like(Projections.Property(() => acc.FirstName), searchedTags[i], MatchMode.Anywhere));
                dis.Add(Expression.Like(Projections.Property(() => acc.LastName), searchedTags[i], MatchMode.Anywhere));
                dis.Add(Expression.Like(Projections.Property(() => acc.Email), searchedTags[i], MatchMode.Anywhere));
            }

            query.And(dis);
        }

        if (city_id != 0)
            query.And(x => city.LocationId == city_id);

        if (town_id != 0)
            query.And(x => town.LocationId == town_id);

        if (school_id != 0)
            query.And(x => school.LocationId == school_id);

        var countquery = query.Clone().ToRowCountQuery().FutureValue<int>();

        pager.TotalPageNumber = countquery.Value;

         //acc.GetType().GetProperty(pager.SortColumn)
        var orderred = query.OrderBy(Projections.Property(pager.SortColumn));



            return ordered.Skip(pager.Skip).Take(pager.Take).List();

var orderred = query.OrderBy(Projections.Property(pager.SortColumn)); line has problem.

问题是,当我将 pager.SortColumn 参数作为字符串传递给 OrderBy 方法时,它无法知道哪个表具有该列并尝试从最后加入数据库表的位置数据库表中获取“名字”。我该如何解决这个问题?提前致谢

最佳答案

您使用了 JoinQueryOver 但之后再也不会在 lambda 中使用 x 了。您可能想要的是 JoinAlias 来创建别名。

.Left.JoinAlias<AccountLogin>(x => x.Logins, () => accl)
.Left.JoinAlias(() => acc.AtentedToProgram, () => prog)
.Left.JoinAlias(() => acc.LiveIn, () => school)
.Left.JoinAlias(() => school.Parent, () => town)
.Left.JoinAlias(() => town.Parent, () => city)

关于c# - nhibernate - queryover - 如何对连接查询进行动态排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11889980/

相关文章:

没有ID的NHibernate映射

c# - 如何定义两个依赖的泛型接口(interface)?

c# - WPF - 通过相对源绑定(bind)为自定义标记扩展提供设计时值(value)

c# - span<T> 和流

c# - Visual Studio 2015 如何将 if 语句后的现有代码快速移动到新放置的花括号中?

c# - 与通用类型 Nhibernate 合并

nhibernate - 流畅的 NHibernate 缓存与自动映射

nhibernate - 如何在 Fluent NHibernate 中设置默认事务隔离级别?

c# - 使用 Fluent NHibernate 选择 N 个随机行

fluent-nhibernate - 动态组件流畅自动映射