如何解决为什么List <long>的SequenceEqual捕获错误?
我有一个名为schoolrep的对象,并且此schoolrep包含许多教育级别ID 我的linq查询给我错误
指定的过滤条件无效
我将发送教育级别ID的列表,我需要返回所有已在过滤器中发送的教育级别的schoolrep。
以下是过滤器,我正在尝试将其设置为固定值以进行测试
List<long> lst = new List<long> { 1,2,3 };
以下是表达式
Expression <Func<SchoolRepresentative,bool>> filterExpression = x =>
x.SchoolRepEducationLevels.Select(x=>x.EducationLevelId).SequenceEqual(lst)
解决方法
这意味着在将查询转换为SQL时,EF不支持SequenceEquals
方法。
我不知道有一个等效的紧凑型SQL查询(在其唯一的子对象具有ID 1、2和3的情况下查找所有对象)。
一种选择是使用x => lst.Contains(x.EducationLevelId)
作为过滤器来加载所有具有1、2或3子级的对象,然后检查内存中是否存在 all 个级别使用您想要的任何方法。
使用LINQKit,您可以创建一个扩展方法,该方法将转换为SQL以生成测试表达式。
public static class IQueryableExt { // using LINQKit
// searchTerms - IEnumerable<TSearch> where all must match for a row
// testFne(row,searchTerm) - test one of searchTerms against a row
// r => searchTerms.All(s => testFne(r,s))
public static Expression<Func<T,bool>> AllAre<T,TSearch>(this IEnumerable<TSearch> searchTerms,Expression<Func<T,TSearch,bool>> testFne) {
var pred = PredicateBuilder.New<T>();
foreach (var s in searchTerms)
pred = pred.And(r => testFne.Invoke(r,s));
return (Expression<Func<T,bool>>)pred.Expand();
}
// searchTerms - IEnumerable<TSearch> where one must match for a row
// testFne(row,bool>> AnyIs<T,bool>> testFne) {
var pred = PredicateBuilder.New<T>();
foreach (var s in searchTerms)
pred = pred.Or(r => testFne.Invoke(r,bool>>)pred.Expand();
}
}
假设您不需要SequenceEquals
,而仅包含所有lst
,则现在可以使用AllAre
创建过滤器表达式:
var filterExpression = lst.AllAre((SchoolRepresentative sr,long l) => sr.SchoolRepEducationLevels.Select(srel => srel.EducationLevelId).Contains(l));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。