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
}
}
提前感谢!
正如别人已经说过的,你应该这样做。
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
});