2011-07-30 23 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(); 

我無法找到跳過任何幫助或採取。工具提示幫助(是的,我絕望)說,跳過並採取返回IQueryOver,但錯誤消息說了一些效果「無法隱式地將IQueryOver {T}轉換爲IQueryOver {T,T}。我不知道什麼IQueryOver {T,T}是我沒有問反正那些之一

回答

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(); 

你可以檢查我的代碼here下載NHibernateQueryOver

UPDATE:

我想你失去了一些東西。我建議你閱讀這個對我非常有用的article
在一段約協會他們說:

的IQueryOver有兩種類型的利益;根類型(查詢返回的實體的類型)以及被查詢的「當前」實體的類型 。例如,下面的查詢使用了一起創造 子QueryOver(analagous打造的ICriteria API中的子標準):

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

的JoinQueryOver返回IQueryOver的新實例比它的根在小貓系列有 。限制 的默認類型現在是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 - 但它並沒有給我ique ryover {T}對象。我不想要數據,我想要查詢,並且我希望查詢包含skip/take。再次感謝。 – Sam

+0

@ user866293:這裏有兩個例子,第一個例子給你NHibernate.IQueryOver LeftyX

+0

左撇子對不起,但例子1 dosn't編譯。如果我刪除IQueryOver {T,T}中的第二個T,則query = query.where(...)會給出錯誤消息。如果我離開第二個T行query = query.Skip(...)不會編譯。我是否缺少使用說明?我有:使用NHibernate;使用NHibernate.Criterion;使用NHibernate。LINQ的; – Sam