Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF-在数据库中搜索多个项目的正确方法_C#_Database_Entity Framework - Fatal编程技术网

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

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

我在数据库中有大约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
        }
    }
}
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已经提出的不同之处,以及为什么更好。