Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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#使用linq查询过滤数组中的值_C#_Linq - Fatal编程技术网

C#使用linq查询过滤数组中的值

C#使用linq查询过滤数组中的值,c#,linq,C#,Linq,我正在处理这个查询数据库的Linq查询 var角色=\u context.Schools .选择(x=> 新建SelectListItem { Value=x.SchoolId.ToString(), Text=x.schoolname邮编 }); 我的查询当前将整行学校放入SelectListItem。然而,我试图做的是添加一个Where子句,它包含一个字符串值ID数组 string[]AssociatedSchoolsArray=AssociatedSchoolId.Split(“,”);

我正在处理这个查询数据库的
Linq
查询

var角色=\u context.Schools
.选择(x=>
新建SelectListItem
{
Value=x.SchoolId.ToString(),
Text=x.schoolname邮编
});
我的查询当前将整行学校放入
SelectListItem
。然而,我试图做的是添加一个Where子句,它包含一个字符串值ID数组

string[]AssociatedSchoolsArray=AssociatedSchoolId.Split(“,”);
变量
AssociatedSchoolsArray
包含一个数组,例如
“1”、“3”

因此,在我最初的
Linq
查询中,我只想筛选
SelectListItem
中的
SchoolIds
13

我怎样才能做到这一点


非常感谢

似乎SchoolId在数据库中存储为int,所以您应该在where语句之前先转换为int,以加快性能

int[] AssociatedSchoolsArray = AssociatedSchoolIDs.Split(",").Select(item => Int32.Parse(item).ToArray();
var roles = _context.Schools.Where(item => AssociatedSchoolsArray.Contains(item.SchoolId))
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        });

你可以用where来表示

   var roles = _context.Schools
                .Where(c=>c.SchoolId == 1 || c.schoolId == 3)
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        });
当然,也可以是事后

   var roles = _context.Schools
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        })
                .Where(c=>c.Value == "1" || c.Value == "3");
基于一系列值:

   var searchWords = new List<string>(new [] { "1", "2"});
   var roles = _context.Schools
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        })
                .Where(c=>searchWords.Contains(c.Value));
var searchWords=新列表(新[]{“1”,“2”});
var角色=_context.Schools
.选择(x=>
新建SelectListItem
{
Value=x.SchoolId.ToString(),
Text=x.schoolname邮编
})
其中(c=>searchWords.Contains(c.Value));

注;您也可以使用
.Any()
,而不是contains。该方法更灵活,因为它接受委托,但由于
.Contains()
是集合对象固有的方法,因此速度可能更快。就EF和linq到sql而言,无论如何都会转换成sql查询,所以我怀疑这是否重要。

。Contains
方法将生成
。。。(1、2、3)中的WHERE列
sql查询

猜测
SchoolId
的类型是
int
,因此需要首先将字符串id解析为整数

var selectedIds = Array.ConvertAll(AssociatedSchoolIDs.Split(","), int.Parse);

var items = _context.Schools
    .Where(school => selectedIds.Contains(school.SchoolId))
    .Select(school => new SelectListItem
        {
            Value = x.SchoolId,
            Text = x.SchoolNamePostCode
        })
    .ToArray();

除了其他优秀答案之外,还有一种使用LINQ查询语法的方法:

var AssociatedSchoolIDs = "1,3";

var selectedIds = AssociatedSchoolIDs
    .Split(",")
    .Select(x => int.Parse(x));

var roles = (from school
             in _context.Schools
             where selectedIds.Contains(school.SchoolId)
             select new SelectListItem
             {
                 Value = school.SchoolId,
                 Text = school.SchoolNamePostCode
             }).ToArray();

带有初始化的少数学校(2-3)和显示所有测试用例的相关id。预期的结果会很好。这能回答你的问题吗?谢谢,但是1和3只是示例,该数组可以是多个值,在
Select
Where
指令下不重要。现在我想起来了,我相信我遇到了类似的问题,我需要将内存中的值列表与数据库中的值进行比较。我不能这样做,因为您无法将内存中的值与db实体进行比较,因此我选择编写自己的自定义查询(
。在(…)
)中执行此操作;使用哪种类型的集合没有区别
HashSet
IEnumerable
,当使用sql时,生成的集合只枚举一次。@Fabio对于使用多个ID进行ID查找,我确信使用
HashSet.Contains
将比
IEnumerable.Contains
更快。与您的解决方案一样,这也只是枚举集合一次。我只是添加了一个方法来加快查找速度。对于DbContext
,其中(item=>collection.Contains(item.Id))
是一个
表达式,它不会对集合(或哈希集)执行
Contains
方法,但是根据表达式信息生成sql查询,一旦onlym没有执行查找操作,它将枚举集合。@Fabio我明白你的意思了。来自
new[]{1,3}.Contains(i)
的已翻译DbExpression树将类似于
((1=@i)或((3=@i))
,至少在EF Core中,所以集合不重要。我已经更新了答案,只是展示了如何使用查询语法,这可能对一些读者很有用。如果有什么问题,请告诉我:-)