改进linq调用以进行一个db调用

mkh04yzy  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(167)

我能得到一些帮助来改进这个linq吗?我基本上是从db返回扬声器,但是如果在过去的一周里有他们发布的视频,就设置HasNew属性为真。

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;
    }
7d7tgy0s

7d7tgy0s1#

你为什么要打第二个电话呢?你应该可以做到:

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;
}
xdnvmnnf

xdnvmnnf2#

如果不知道您使用的是什么LINQ提供程序(例如默认的LINQ To SQL或对象关系Map器,如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搜索,您也希望找到自上周以来的所有视频。
  • 将所有最近的视频作为一个数组查找,这样我们就不会在下一部分中多次枚举该集合。
  • 迭代所有的发言人,并检查该发言人是否有任何最近的视频。
  • 然后,如果需要,按显示名称订购扬声器。

相关问题