2013-05-27 8 views
5

Riferimento: nhibernate criteria for selecting from different tablesRecuperare le unità degli ultimi 5 ordini

ho cercato di recuperare per esempio ultimi 5 ordini ma ho ottenuto le ultime 5 unità!

Model.Order orderAlias = null; 
Model.Unit unitsAlias = null; 
Model.Employee employeeAlias = null; 

IList<Model.Unit> itemList = null; 

using (m_hibernateSession.BeginTransaction()) 
{ 
    var query = m_hibernateSession.QueryOver<Model.Unit>(() => unitsAlias) 
        .JoinAlias(() => unitsAlias.OrderRef,() => orderAlias, JoinType.InnerJoin) 
        .JoinAlias(() => unitsAlias.EmployeeRef,() => employeeAlias, JoinType.InnerJoin); 

    // add additional filters if set 
    if (propertiesNames.Keys.Contains("Employee")) query.Where(Restrictions.On(() => employeeAlias.Name).IsLike("%" + (string)propertiesNames["Employee"] + "%")); 
    if (propertiesNames.Keys.Contains("Division")) query.Where(() => unitsAlias.Division == (string)propertiesNames["Division"]); 

    query.Where(() => orderAlias.PONumber != 0).OrderBy(() => orderAlias.PONumber).Desc.Take(5); 

    itemList = query.List<Model.Unit>(); 
} 

Quali modifiche sono necessarie per ottenere le unità degli ultimi 5 ordini?

Thx

+0

Perché ti sei unito con la tabella Employee? –

+0

È per un altro filtro! – leon22

+0

Un'idea dalla mia parte: prima recupera una lista con questi 5 ordini e sostituisci l'ordineAlias ​​con SelectList (...) !? – leon22

risposta

0

ecco la soluzione:

Model.Order orderAlias = null; 
Model.Unit unitsAlias = null; 
Model.Employee employeeAlias = null; 

IList<Model.Unit> itemList = null; 

using (m_hibernateSession.BeginTransaction()) 
{ 
    IQueryOver<Model.Order, Model.Order> orderQuery = m_hibernateSession.QueryOver<Model.Order>(); 

    // order related filters 
    if (propertiesNames.Keys.Contains("OrderPONumber")) orderQuery.Where(o => o.PONumber == Int32.Parse((string)propertiesNames["OrderPONumber"])); 

    // retrieve amount of orders (e.g. 5) 
    orderQuery.Where(o => o.PONumber != 0).Select(o => o.ID).OrderBy(o => o.PONumber).Desc.Take(amount); 

    int[] orderIDList = orderQuery.List<int>().ToArray(); // get ID list of filtered orders 
    IQueryOver<Model.Unit, Model.Unit> query = m_hibernateSession.QueryOver<Model.Unit>(() => unitsAlias)           
         .WhereRestrictionOn(o => o.OrderRef.ID).IsIn(orderIDList) // set order ID range 
         .JoinAlias(() => unitsAlias.EmployeeRef,() => employeeAlias, JoinType.InnerJoin); 

    // additional filters 
    if (propertiesNames.Keys.Contains("CostCenter")) query.Where(() => unitsAlias.CostCenter == (string)propertiesNames["CostCenter"]);     
    if (propertiesNames.Keys.Contains("Employee")) query.Where(Restrictions.On(() => employeeAlias.Name).IsLike("%" + (string)propertiesNames["Employee"] + "%")); 


    itemList = query.List<Model.Unit>(); 
} 
1

Prova questa:

//A List (with a maximum of 5 elements) of Lists of Units 
    List<List<Model.Unit>> listOfUnits = m_hibernateSession 
             .Query<Order>() 
             .OrderByDescending(o=>o.PONumber) 
             .Where(o => o.PONumber != 0) 
             .Take(5) 
             .Select(o => o.Units.ToList()) 
             .ToList(); 

    //OR, a List of all Units for the last 5 Orders 
    List<Model.Unit> listOfUnits = m_hibernateSession 
             .Query<Order>() 
             .OrderByDescending(o=>o.PONumber) 
             .Where(o => o.PONumber != 0) 
             .Take(5) 
             .SelectMany(o => o.Units) 
             .ToList(); 
+0

Thx, ma non c'è .Query in questo contenuto e ho alcuni filtri che non voglio perdere! (ad esempio if (propertiesNames.Keys.Contains ("Employee")) query.Where (Restrictions.On (() => employeeAlias.Name) .IsLike ("%" + (string) propertiesNames ["Employee"] + "% "));) Qualche idea? – leon22

Problemi correlati