Linq 到实体 检查出生日期是否在给定的日期范围集 (EF6) 之间



我需要从用户输入的多个日期范围中的任何一个中过滤人员表中的记录...

 List<Tuple<DateTime,DateTime>> dateranges=.......;
    var filtered=context.Person.Where (x=>dateranges.Any(y=>x.Dob>y.Item1 && x.Dob< y.Item2));

这将引发异常

    "Unable to process the type 'System.Tuple`2[[System.DateTime, mscorlib, Version=4.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.DateTime, mscorlib, Version=4.0.0.0,
 Culture=neutral, PublicKeyToken=b77a5c561934e089], because it has no known mapping to the 
value layer."

知道处理这个问题的最佳方法是什么吗?

这是一个精心设计的查询,在 Linq to EF 和 Linq to Object 之间跳转。

List<Tuple<DateTime,DateTime>> dateranges=.......;
IEnumerable<IQueryable<Person>> queries = from d in dateranges
                                         let startDate = d.Item1
                                         let endDate = d.Item2
              select (context.Person.Where(p => p.Birthday >= startDate && p.Birthday <= enDate));
IQueryable<Person> query = queries.Aggregate(Queryable.Concat);

但是,我必须补充一点,就EF查询规划器或SQL服务器查询规划器而言,这不是很有效。您可能会发现此方法的索引的性能问题。

使用EntityFramework.Extended的.Future()可能会更有效

List<Tuple<DateTime,DateTime>> dateranges=.......;
List<FutureQuery<Person>> queries = from d in dateranges
                                         let startDate = d.Item1
                                         let endDate = d.Item2
              select (context.Person.Where(p => p.Birthday >= startDate && p.Birthday <= enDate).Future()).ToList();
IEnumerable<Person> query = queries.SelectMany(x =>);

相关内容

  • 没有找到相关文章

最新更新