Linq查询匹配多个参数

时间:2016-12-06 09:18:32

标签: entity-framework linq

我有一个模型列表,我填充了项目。以下列表中填充了以下项目: -

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

2 个答案:

答案 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条记录来说,这是多么高效,你将不得不进行测试。如果这不起作用,您可以使用表值参数编写存储过程。