4

ランダムに並べられた結果を返すクエリを作成しようとしています。この投稿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;                    
            });

任意の提案をいただければ幸いです。ありがとう

4

2 に答える 2

2

これを行う方法の良い例を次に示します。これは私が現在使用しているテクニックです。

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();  
} 
于 2012-05-19T14:57:23.853 に答える
1

ページングで上記のアプローチを使用するには、ユーザーのシードを (おそらくセッションごとに) 保存してから、SQL で RAND(seed) 関数を使用できます。同じシードを使用するため、同じシーケンスが生成されます。疑似乱数を使用するため、ページングが可能

于 2012-05-21T12:49:57.260 に答える