2010-08-24 136 views
0

是否有任何方法來優化此解決方案? 是否有可能通過調用單個查詢來獲得相同的結果?nhibernate「加入」

public List<Company> GetCompanies(DateTime maxDate, int stockQuotesCount) 
    { 
     List<Company> result = new List<Company>(); 
     IList<Company> company = null; 
     DateTime lastSessionDate = new StockQuoteRepository().GetLastSessionDate(maxDate); 

     using (ISession s = DataAccessFacade.OpenSesion()) 
     { 
      String sqlQuery = string.Empty; 
      sqlQuery = @"Select 
            * 
           From 
            dbo.Company c 
           Where 
            c.Company_FirstQuotationDate <= :date and 
            (c.Company_LastQuotationDate >= :date or c.Company_LastQuotationDate is Null) 
           Order By 
            c.Company_Name asc"; 

      company = s.CreateSQLQuery(sqlQuery) 
           .AddEntity(typeof(Company)) 
           .SetDateTime("date", lastSessionDate) 
           .List<Company>(); 


      if (company != null) 
      { 
       for (int i = 0; i < company.Count; i++) 
       { 
        sqlQuery = @"Select 
            Top(:top) 
            * 
           From 
            dbo.StockQuote sq 
           Where 
            sq.StockQuote_Company_Id = :cId 
            and sq.StockQuote_Date <= :date 
           Order By 
            sq.StockQuote_Date desc"; 

        company[i].StockQuotes = s.CreateSQLQuery(sqlQuery) 
             .AddEntity(typeof(StockQuote)) 
             .SetParameter<int>("cId", company[i].Id) 
             .SetParameter<int>("top", stockQuotesCount) 
             .SetDateTime("date", lastSessionDate) 
             .List<StockQuote>(); 
       } 
      } 

     } 
     return (List<Company>)company; 
    } 

我流利的壓縮映像:

public class CompanyMap : ClassMap<Company> 
{ 
    public CompanyMap() 
    { 
     this.Id(x => x.Id).Column("Company_Id"); 
     this.Map(x => x.Name).Column("Company_Name"); 
     this.Map(x => x.FirstQuotationDate).Column("Company_FirstQuotationDate"); 
     this.Map(x => x.LastQuotationDate).Column("Company_LastQuotationDate"); 
     this.HasMany(x => x.StockQuotes) 
      .Cascade.All() 
      .BatchSize(50) 
      .Inverse(); 
    } 
} 


    public class StockQuoteMap : ClassMap<StockQuote> 
{ 
    public StockQuoteMap() 
    { 
     this.Id(x => x.Id).Column("StockQuote_Id"); 
     this.Map(x => x.Open).Column("StockQuote_Open"); 
     this.Map(x => x.Low).Column("StockQuote_Low"); 
     this.Map(x => x.High).Column("StockQuote_High"); 
     this.Map(x => x.Close).Column("StockQuote_Close"); 
     this.Map(x => x.Volume).Column("StockQuote_Volume"); 
     this.Map(x => x.Date).Column("StockQuote_Date"); 
     this.References(x => x.Company).Column("Company_Id"); 
    } 
} 

回答

0

好吧,這是更好的查詢

using (ISession s = DataAccessFacade.OpenSesion()) 
     { 
      String cHql = @"select 
           distinct c 
          from 
           Company c 
           join fetch c.StockQuotes s 
          where 
           c.FirstQuotationDate <= :maxDate and 
           (c.LastQuotationDate >= :maxDate or c.LastQuotationDate is Null) 
           and s.Date >= :minDate 
          order by 
           c.Name asc, 
           s.Date desc"; 

      result = s.CreateQuery(cHql) 
       .SetDateTime("maxDate", lastSessionDate) 
       .SetDateTime("minDate", lastSessionDate.AddMonths(-2)) 
       .List<Company>().ToList(); 
     } 

,但有一個問題, ,而沒有給時間期限,經StockQuote.Date選擇股票報價形成Company.StockQuotes,想在這個加入的收藏品上製作TOP()

真的,我只知道maxDate(在這種情況下),計算minDate非常困難