2012-03-24 40 views
0

我可以在改進此linq方面有所幫助。我基本上是從數據庫返回揚聲器,但如果在過去一週內發佈了他們的視頻,則將HasNew屬性設置爲true。改進linq調用使一個數據庫調用

public IQueryable<Speaker> GetSpeakers() 
    { 
     var speakers = db.Speakers.OrderBy(x => x.DisplayName); 
     var newVidsSpeakers = db.Videos.Where(x => x.DatePosted > DateTime.Now.AddDays(-7)).Select(x=> x.Speaker).Distinct(); 
     foreach (var item in newVidsSpeakers) 
     { 
      var sp = speakers.SingleOrDefault(x => x.ID == item.ID); 
      sp.HasNew = true; 
     } 
     return speakers; 
    } 
+0

您使用的是LINQ提供程序? – Oded 2012-03-24 20:58:00

+0

@Oded我正在使用LINQ to sql – raklos 2012-03-24 21:08:16

+0

您可以使用[Join operator](http://msdn.microsoft.com/zh-cn/library/bb534675.aspx) – 2012-03-24 21:22:30

回答

1

你爲什麼要打第二個電話呢?你應該能夠做到:

public IQueryable<Speaker> GetSpeakers() 
{ 
    var speakers = db.Speakers.OrderBy(x => x.DisplayName); 
    var newVidsSpeakers = db.Videos.Where(x => x.DatePosted > DateTime.Now.AddDays(-7)).Select(x => x.Speaker).Distinct(); 
    foreach (var speaker in newVidsSpeakers) 
    { 
     speaker.HasNew = true; 
    } 
    return speakers; 
} 
+0

將發言人和視頻的呼叫合併到1? – raklos 2012-03-24 21:06:07

+0

其實我只是意識到這不是什麼讓我放慢腳步,這是別的東西......無論如何感謝 – raklos 2012-03-24 21:15:05

1

不知道你正在使用LINQ提供程序(如默認LINQ to SQL或一個對象關係映射器像Mindscape LightspeedNHibernate)上的數據庫架構或信息就很難給任何的建議。

因此,除非已知,否則我可以做的最好的事情是重新安排LINQ語句,以便爲選定的提供者提供更多的知識/上下文,以便它可以更好地優化查詢,從而可能減少數據庫調用的次數。

注:您可能會發現這是不可能將這一數字減少到數據庫調用。

這是我如何寫一個類似的查詢。

public IEnumerable<Speaker> GetSpeakers() 
{ 
    var speakers = db.Speakers; 
    var lastWeek = DateTime.Now.Date.AddDays(-7); 
    var recentVideos = db.Videos.Where(x => (x.DatePosted.Date >= lastWeek)).ToArray(); 

    foreach (var speaker in speakers) 
     speaker.HasNew = recentVideos.Any(x => (x.Speaker == speaker)); 

    return speakers.OrderBy(x => x.DisplayName); 
} 
  • 獲取揚聲器無序的執行訂貨到晚越好。如果訂購是爲了演示,那麼稍後在視圖中進行。
  • 商店日期是上週。我使用的是DateTime.Now.Datex.DataPosted.Date,因此我們沒有比較時間,也就是說,即使您在晚上11:59進行搜索,也希望自上週開始查找所有視頻。
  • 查找所有最近的視頻作爲數組,以便我們不會在下一部分多次枚舉集合。
  • 迭代所有揚聲器並檢查該揚聲器是否有最近的視頻。
  • 然後,如果需要,按顯示名稱排列揚聲器。

希望這會有所幫助。有任何問題請詢問。