我在数据库中有大约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
}
}
提前致谢!
答案 0 :(得分:1)
您可以使用以下内容:
db.Rights.Where(right => inputRightsIds.Contains(right.Id));
答案 1 :(得分:1)
它们应该是非常相似的速度,因为它们必须枚举相同次数的数组。根据输入数据,两者之间的速度可能存在微妙的差异,但一般情况下我会选择变体2 。我认为你应该在可能的情况下更喜欢LINQ而不是手动枚举。还要考虑使用以下LINQ语句将整个搜索简化为单行。
var matches = db.Rights.Where(r=> inputRightIds.Contains(r.Id));
...//Do stuff with matches
答案 2 :(得分:1)
正如其他人已经说过的那样,你应该做到以下几点。
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调用返回您希望每次调用所需的部分信息。上面的查询将对数据库进行一次SQL调用,并仅返回您感兴趣的数据。这是最好的方法,因为它减少了对DB进行多次调用并返回过多数据的两个瓶颈。
答案 3 :(得分:1)
不要忘记将所有物品放入内存中以进一步处理
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
});