0

我已经编写了 Linq 查询以更快速地检索记录。但是在将本地集合值传递给 Linq 查询时需要更多时间来检索:

在这里,我使用实体框架进行 LinQ 查询。我需要根据此处作为字符串集合传递的所有 platformId 获取 forumthread

目标:我们如何以更有效的方式在单个 linQ 查询中检索具有匹配 id 集合的记录?例如:慢执行查询:

public void GetThreadCollection(string[] platformid)
{
    using (SupportEntity support=new SupportEntity())
    {
        var ThreadCollection = (from platid in platformid
                                from thread in support.ForumThread
                                from platform in support.Platforms
                                where platid == thread.Platformid &&
                                      platform.PlatformId==platid
                                select new
                                {
                                    ThreadId = thread.threadid,
                                    Title = thread.Title,
                                    description = thread.desc,
                                    platformName = platform.platformName
                                }).ToList();                        
    }
}

例如:然后我重写了代码以避免执行时间变慢,方法是发送单个平台 id 以使用迭代检索记录:for each: 但这也花费了前一个更少的时间。但效率不高。

前任:

public function(string[] platformId)
{
    foreach(platid in platformId)
    {
        using (SupportEntity support = new SupportEntity())
        {    
            var Threads = (from thread in support.ForumThread
                           from platform in support.Platforms
                           where platid == thread.Platformid &&
                                 platform.PlatformId == platid
                           select new
                           {
                               ThreadId = thread.threadid,
                               Title = thread.Title,
                               description = thread.desc,
                               platformName = platform.platformName
                           }).ToList();

            ThreadCollection.AddRange(threads);                     
        }
    }      
}

您能否建议,如何在单个查询中更有效地获取写入单个查询以检索记录?

4

2 回答 2

3

要将一堆 Id 传递给查询以与数据库中的 Id 进行比较,通常您会使用Contains调用而不是循环遍历它(这将导致对循环的每次迭代进行另一个查询,并且会很慢)。我不能完全收集它如何适合您的实体,因为我不确定这using (SupportEntity support = new SupportEntity())部分将如何工作,但这里有一个简单的例子:

public IEnumerable<Car> GetCarsMatchingIds(IEnumerable<int> carIds)
{
    using(var dealershipContext = new DealershipContext())
    {
        return dealershipContext.Cars.Where(c => carIds.Contains(c.Id));
    }
}
于 2013-07-23T13:13:01.317 回答
1

首先,Ocelot 所说的:Contains将直接翻译成 SQL 中的等效测试(类似where id in (1, 2, 3))并且效率最高。其次,平台实体应该具有相关线程的导航属性。您应该能够将查询减少到如下所示:

from platform in support.Platforms
where platids.Contains(platform.id)
from thread in platform.ForumThreads
select ...
于 2013-07-23T14:48:26.187 回答