2011-07-30 5 views
6

を取るか、私はこれをしたい:はどのように私はスキップを追加し、NHibernateはIQueryOverに

NHibernate.IQueryOver<DataAccess.Domain.Product, DataAccess.Domain.Product> query = session.QueryOver<DataAccess.Domain.Product>(); 
query = query.Where(x => x.Name == "X"); 
query = query.Take(1).Skip(3); 
List<Product> results = query.List().ToList(); 

私はスキップ上の任意のヘルプを見つけるか、乗り傾けます。ツールヒントのヘルプ(はい、私は必死だ)Skip and TakeはIQueryOverを返すと言っているが、エラーメッセージには何か「Cantは暗黙的にIQueryOver {T}をIQueryOver {T、T}に変換する」と書かれています。 {T、T}は、私はとにかくそれらの1のために要求していない

答えて

2

このようなあなたのコードに変更してみてください。。

NHibernate.IQueryOver<DataAccess.Domain.Product> query = session.QueryOver<DataAccess.Domain.Product>(); 
query = query.Where(x => x.Name == "X"); 
query = query.Take(1).Skip(3); 
var results = query.List(); 

または、さらに良いの:

var results = session.QueryOver<DataAccess.Domain.Product>() 
     .Where(x => x.Name == "X") 
     .Take(1) 
     .Skip(3) 
     .List(); 

あなたは私のコードを確認できますhereNHibernateQueryOver

UPDATE:

私はあなたが何かが欠けていると思います。私は本当に私のために役立っているarticleを読むことをお勧めします。 団体についての段落
彼らは言う:

アンIQueryOverは、関心の2種類があります。ルートタイプ(クエリが返すエンティティのタイプ)、および「現在の」エンティティ のタイプを照会します。

IQueryOver<Cat,Kitten> catQuery = 
    session.QueryOver<Cat>() 
     .JoinQueryOver(c => c.Kittens) 
      .Where(k => k.Name == "Tiddles"); 

JoinQueryOverはIQueryOverの新しいインスタンスを返すたとえば、次のクエリは、(ICriteria APIサブ基準を作成するanalagous) サブQueryOver作成するジョインを使用しKittensコレクションのルートは です。制限のデフォルトのタイプ は、Kitten(上記の の例では 'Tiddles'という名前に制限されています)を呼び出す一方、.List()を呼び出すとIListを返します。タイプ IQueryOverはIQueryOverから継承します。

これは私が複数のフィルタを構築したいときに私は何をすべきかです:

Domain.OrderAddress addressDestination = null; 
Domain.Customer customer = null; 
Domain.TermsConditionsOfSale termsConditionsOfSale = null; 

ICriterion filter1 = Restrictions.Where<Domain.Order>(t => t.Company == "MYCOMPANY"); 
ICriterion filter2 = Restrictions.Where<Domain.Order>(t => t.WareHouseDelivery == "DEPXX"); 
ICriterion filter3 = Restrictions.Where<Domain.Order>(t => t.Status == "X"); 
ICriterion filter4 = Restrictions.Where(() => addressDestination.AddressType == "99"); 
ICriterion filter5 = Restrictions.Where(() => addressDestination.Province.IsIn(new string[] { "AA", "BB", "CC" })); 
ICriterion filter6 = Restrictions.Where(() => termsConditionsOfSale.ReturnedGoodsCode != "01"); 

var ordersForProvinces = session.QueryOver<Domain.Order>() 
    .Inner.JoinAlias(t => t.OrderAddresses,() => addressDestination) 
     .Inner.JoinAlias(t => t.Customer,() => customer) 
     .Left.JoinAlias(t => t.TermsConditionsOfSale,() => termsConditionsOfSale); 

ordersForProvinces 
    .Where(filter1) 
     .And(filter2) 
     .And(filter3) 
     .And(filter4) 
     .And(filter5) 
     .And(filter6); 

var Results = ordersForProvinces.Skip(50).Take(20).List(); 

UPDATE-UPDATE:

NHibernate.IQueryOver<Domain.Person> person = session.QueryOver<Domain.Person>(); 
var myList = DoSomething(person); 

方法:

private static IList<Domain.Person> DoSomething(NHibernate.IQueryOver<Domain.Person> persons) 
{ 
    ICriterion filter1 = Restrictions.Where<Domain.Person>(t => t.CompanyName.IsLike("Customer%")); 

    persons.RootCriteria.Add(filter1); 
    var x = persons.Skip(1).Take(3).List(); 
    return (x); 
} 
+0

をいただき、ありがとうございますあなたの返答Lefty - しかし、それは私には不安を与えませんryover {T}オブジェクト。私はデータを望んでいない、私はクエリが欲しい、私はスキップ/テイクを含めるクエリをしたい。再度、感謝します。 – Sam

+0

@ user866293:そこには2つの例があり、最初にはNHibernate.IQueryOver LeftyX

+0

Leftyがあります。残念ですが、例1はコンパイルできません。 IQueryOver {T、T}で2番目のTを削除すると、line query = query.where(...)はエラーmsgを返します。私が2番目のTを残すと、line query = query.Skip(...)はコンパイルされません。私は使用している文を紛失していますか?私は持っている:NHibernateを使用する; NHibernate.Criterionを使用します。 NHibernateを使用します。Linq; – Sam

関連する問題