EF -一个正确的方式来搜索多个项目的数据库

本文关键字:方式 搜索 数据库 项目 EF 一个 | 更新日期: 2023-09-27 18:06:04

我在数据库中有大约100个项目(allRights)和大约10个id-s要搜索(inputRightsIds)。哪一个更好-首先获得所有的权利,然后搜索项目(变体1)或向数据库发出10次检查请求下面是一些示例代码:

DbContext db = new DbContext();
int[] inputRightsIds = new int[10]{...};

变体1

var allRights = db.Rights.ToLIst();
foreach( var right in allRights)
{
    for(int i>0; i<inputRightsIds.Lenght; i++)
    {
        if(inputRightsIds[i] == right.Id)
        {
            // Do something
        }
    }
}

变种2

for(int i>0; i<inputRightsIds.Lenght; i++)
{
    if(db.Rights.Any(r => r.Id == inputRightsIds[i]);)
    {
        // Do something
    }
}

提前感谢!

EF -一个正确的方式来搜索多个项目的数据库

正如别人已经说过的,你应该这样做。

var matchingIds = from r in db.Rights
                  where inputRightIds.Contains(r.Id)
                  select r.Id;
foreach(var id in matchingIds)
{
    // Do something
}

但这与你的两种方法不同。在第一种方法中,您对返回的结果多于您感兴趣的DB进行一次SQL调用。第二种方法是进行多次SQL调用,每次调用返回您想要的部分信息。上面的查询将对DB进行一次SQL调用,并只返回您感兴趣的数据。这是最好的方法,因为它减少了对DB进行多次调用和返回过多数据的两个瓶颈。

您可以使用以下命令:

db.Rights.Where(right => inputRightsIds.Contains(right.Id));

它们应该具有非常相似的速度,因为它们必须枚举相同次数的数组。根据输入数据的不同,两者之间的速度可能会有细微的差异,但通常我会使用变体2。我认为在可能的情况下,你应该总是选择LINQ而不是手动枚举。还可以考虑使用下面的LINQ语句将整个搜索简化为一行。

var matches = db.Rights.Where(r=> inputRightIds.Contains(r.Id));
...//Do stuff with matches

不要忘记将所有项放入内存以进一步处理列表

var itemsFromDatabase = db.Rights.Where(r => inputRightsIds.Contains(r.Id)).ToList();

或者您甚至可以通过集合枚举并对每个项做一些操作

db.Rights.Where(r => inputRightsIds.Contains(r.Id)).ToList().Foreach(item => {
      //your code here
});