C# EF-在数据库中搜索多个项目的正确方法
我在数据库中有大约100个项目(allRights)和大约10个要搜索的id-s(inputRightsIds)。哪一个更好-首先获取所有权限,然后搜索项目(变体1),或者向数据库发出10个检查请求 下面是一些示例代码:C# EF-在数据库中搜索多个项目的正确方法,c#,database,entity-framework,C#,Database,Entity Framework,我在数据库中有大约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 al
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
}
}
}
var allRights=db.Rights.ToLIst();
foreach(所有权利中的var权利)
{
对于(inti>0;i0;irid==inputRightsIds[i]);)
{
//做点什么
}
}
提前谢谢 您可以使用以下命令:
db.Rights.Where(right=>inputRightsIds.Contains(right.Id));
您可以使用以下命令:
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
它们的速度应该非常相似,因为两者必须枚举相同次数的数组。根据输入数据的不同,两者之间的速度可能会有细微的差异,但通常我会选择变体2。我认为在可能的情况下,您应该总是更喜欢LINQ而不是手动枚举。还要考虑使用以下LINQ语句将整个搜索简化为单行。
var matches = db.Rights.Where(r=> inputRightIds.Contains(r.Id));
...//Do stuff with matches
正如其他人已经声明的那样,您应该执行以下操作
var matchingIds = from r in db.Rights
where inputRightIds.Contains(r.Id)
select r.Id;
foreach(var id in matchingIds)
{
// Do something
}
但这两种方法都不同。在第一种方法中,您对数据库进行一次SQL调用,返回的结果比您感兴趣的多。第二种方法是进行多次SQL调用,每次调用返回所需的部分信息。上面的查询将对数据库进行一次SQL调用,并只返回您感兴趣的数据。这是最好的方法,因为它减少了对数据库进行多次调用和返回太多数据的两个瓶颈。正如其他人所说,您应该执行以下操作
var matchingIds = from r in db.Rights
where inputRightIds.Contains(r.Id)
select r.Id;
foreach(var id in matchingIds)
{
// Do something
}
但这两种方法都不同。在第一种方法中,您对数据库进行一次SQL调用,返回的结果比您感兴趣的多。第二种方法是进行多次SQL调用,每次调用返回所需的部分信息。上面的查询将对数据库进行一次SQL调用,并只返回您感兴趣的数据。这是最好的方法,因为它减少了对数据库进行多次调用和返回太多数据的两个瓶颈。不要忘记将所有项目放入内存以进一步处理列表
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
});
别忘了把所有的项目都放到内存中,以便进一步处理列表
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
});
从技术上讲,这是一个SQL调用的第三个选项,只需返回所需的结果。这与变量2不同,变量2执行多个SQL调用,变量1执行一个大型SQL调用,然后进行筛选。从技术上讲,这是一个SQL调用的第三个选项,只需返回所需的结果。这与变量2不同,变量2进行多个SQL调用,变量1进行一个大型SQL调用,然后进行筛选。您应该解释这与OP已经提出的不同之处,以及为什么更好。您应该解释这与OP已经提出的不同之处,以及为什么更好。