我需要从人员表中过滤记录,其中Dob字段(日期)位于用户输入的多个日期范围中的任何一个中 ......
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."
任何想法处理这个问题的最佳方法是什么?
答案 0 :(得分:0)
这是一个精心设计的查询,它在Linq到EF和Linq到Objects之间跳转。
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&#39; s .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 =>);