2012-03-24 4 views
0

このlinqを改良する助けがありますか?私は基本的にデータベースからスピーカーを戻していますが、過去1週間に投稿されたビデオがあった場合、HasNewプロパティをtrueに設定しています。1つのdbコールを行うために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

+0

@Oded linqをSQLに使用しています – raklos

+0

[Join operator](http://msdn.microsoft.com/en-us/library/bb534675.aspx) –

答えて

1

どうして2回目の呼び出しをしていますか?それはすることは困難である(Mindscape LightspeedまたはNHibernateのように例えばSQLへのデフォルトLINQまたはオブジェクトリレーショナルマッパー)を使用しているどのような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 speaker in newVidsSpeakers) 
    { 
     speaker.HasNew = true; 
    } 
    return speakers; 
} 
+0

を使用して、スピーカーとビデオの呼び出しをマージできます1? – raklos

+0

実際に私はこれが私を減速させているわけではないことに気づいた、それは別のものだ...とにかくこれに感謝 – raklos

1

またはデータベーススキーマの情報:あなただけ行うことができる必要がありますアドバイスをください。

これまでわかっていたことは、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分に検索しても先週以降のすべての動画を検索したいとします。
  • 最近のすべての動画を配列として検索し、次の部分でコレクションを複数回列挙しないようにします。
  • すべてのスピーカーを繰り返して、そのスピーカーに最近のビデオがあるかどうかを確認します。
  • 必要に応じて、表示名でスピーカーを注文します。

これが役に立ちます。ご質問ください。

関連する問題