我有一个模型列表,我填充了项目。以下列表中填充了以下项目: -
List<Entry> list = new List<Entry>
{
new Entry { EmployeeId = 1, EntryDate = '2016-11-01', InDate = '2016-11-01' },
new Entry { EmployeeId = 1, EntryDate = '2016-11-05', InDate = '2016-11-05' },
new Entry { EmployeeId = 2, EntryDate = '2016-11-01', InDate = '2016-11-01' }
};
现在我想从数据库中查询表Entry
,使记录与EmployeeId
&amp;上的列表匹配。 EntryDate
作为参数。
条目表与上面的代码中的列相同。
如果是一个字段,我可以使用contains
,但对于多个字段,我该怎么办?
我的数据库表格结果应与上面的列表匹配,其中2列符合EmployeeId
&amp; EntryDate
。
答案 0 :(得分:2)
逻辑上,你想要的是:
var query = db.Table.Where(e => list.Any(le => e.EmployeeId == le.EmployeeId &&
e.EntryDate == le.EntryDate));
我不知道这是否适用于实体框架,但值得一试。 (例如,LINQ to Objects会很好。)
答案 1 :(得分:2)
您可以通过.Contains
运算符和匿名类型以与EF兼容的方式实现此目的。
您需要先将列表投影到一个匿名类型,该类型只包含您要比较的属性。
var projection = from e in list
select new { e.EmployeeId, e.EntryDate };
然后,您可以将其与查询中的相同投影进行比较。
var query = db.Table.Where(e => projection.Contains(new { e.EmployeeId, e.EntryDate }));
然而,这会生成在list
中每个项目有两个参数的SQL。对于500条记录来说,这是多么高效,你将不得不进行测试。如果这不起作用,您可以使用表值参数编写存储过程。