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
1和3
我怎样才能做到这一点
非常感谢似乎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中,所以集合不重要。我已经更新了答案,只是展示了如何使用查询语法,这可能对一些读者很有用。如果有什么问题,请告诉我:-)