EF - 搜索数据库中多个项目的正确方法

时间:2015-08-03 17:30:59

标签: 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 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
    }
}

提前致谢!

4 个答案:

答案 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
});