【问题标题】:Nhibernate queryover order by randomNhibernate queryover order by random
【发布时间】:2012-05-19 14:50:41
【问题描述】:

我正在尝试编写一个返回随机排序结果的查询。我发现这篇文章Linq Orderby random ThreadSafe for use in ASP.NET 给了我一些如何做到这一点的基本线索。但我得到以下异常:

从范围“”引用的“Accomodations.DAL.Model.Generated.Accomodation”类型的变量“x”,但未定义

这是我的查询:

                var query = session.QueryOver<Accomodation>()
                                   .OrderBy(x => (~(x.Id & seed)) & (x.Id | seed)).Asc; // this is the problematic line of code                    

                if (searchParams.District != 0)
                    query = query.Where(x => x.District.Id == searchParams.District);

                if (searchParams.Region != 0)
                    query = query.Where(x => x.Region.Id == searchParams.Region);

                if (searchParams.Location != 0)
                    query = query.Where(x => x.Location.Id == searchParams.Location);

                var futureCount = query.Clone().Select(Projections.RowCount()).FutureValue<int>();

                SearchAccomodationResultItem resultItemAlias = null;

                var futurePage = query                        
                    .SelectList(list => list
                        .Select(x => x.Id).WithAlias(() => resultItemAlias.Id)
                        .Select(x => x.AccomodationType.Id).WithAlias(() => resultItemAlias.AccomodationTypeId)
                        .Select(x => x.Region.Id).WithAlias(() => resultItemAlias.RegionId)
                        .Select(x => x.Name).WithAlias(() => resultItemAlias.Title)
                        .Select(x => x.MaxCapacity).WithAlias(() => resultItemAlias.MaxCapacity)
                        .Select(x => x.MinPrice).WithAlias(() => resultItemAlias.MinPrice)
                        .Select(x => x.MinStayLength).WithAlias(() => resultItemAlias.MinStayLength)
                        .Select(x => x.MainImageName).WithAlias(() => resultItemAlias.ImgSrc)                           
                        )                        
                    .TransformUsing(Transformers.AliasToBean<SearchAccomodationResultItem>())                        
                    .Skip(skip)                        
                    .Take(searchParams.PageSize)
                    .Future<SearchAccomodationResultItem>();

                searchResults = futurePage.ToList();
                numberOfResults = futureCount.Value;                    
            });

任何建议将不胜感激。谢谢

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    这是一个很好的例子来说明如何做到这一点。这是我目前正在使用的一种技术。

    http://puredotnetcoder.blogspot.com/2011/09/nhibernate-queryover-and-newid-or-rand.html

    编辑

    以下内容摘自上述文章,我对其稍作修改以包括Skip

    public IList<CmsTestimonial> GetRandomTestimonials(int count, int skip) {  
      return Session  
        .QueryOver<CmsTestimonial>()  
        .OrderByRandom()
        .Take(count)  
        .Skip(skip)
        .List();  
    } 
    

    【讨论】:

    • 谢谢,但我不确定这是否对我有帮助,因为我想在用户使用分页时保留订单。当我使用您的示例时,分页会起作用吗?
    • 为什么分页不起作用?该帖子中定义的OrderByRandom 扩展方法返回IQueryOver&lt;TRoot, TSubType&gt;。看到文末的例子了吗?如果不清楚,我已经在上面发布了。
    • 好博客,不知道是谁写的 :) 关于分页的一点,这不会起作用,因为第一页上显示的一些记录可能会显示在第 2 页或第 3 页等。要随机记录分页将非常棘手,因为您需要将所有结果随机存储在一个表中(也许对于每个用户)!我真的会想你为什么需要随机记录和分页!
    【解决方案2】:

    要将上述方法与分页一起使用,您可以为用户存储种子(可能基于每个会话),然后在 SQL 中使用 RAND(seed) 函数 - 因为您使用相同的种子,它会生成相同的伪随机数序列,因此允许分页

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 2014-08-07
      • 2015-03-19
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      相关资源
      最近更新 更多