Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 用于匹配多个参数的Linq查询_Entity Framework_Linq - Fatal编程技术网

Entity framework 用于匹配多个参数的Linq查询

Entity framework 用于匹配多个参数的Linq查询,entity-framework,linq,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' }, ne

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

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' }
};
List List=新列表
{
新条目{EmployeeId=1,EntryDate='2016-11-01',InDate='2016-11-01'},
新条目{EmployeeId=1,EntryDate='2016-11-05',InDate='2016-11-05'},
新条目{EmployeeId=2,EntryDate='2016-11-01',InDate='2016-11-01'}
};
现在我想从数据库中查询一个表
条目
,这样记录应该与上面的列表匹配,并将
EmployeeId
EntryDate
作为参数

条目表的列与上面代码中的列相同

如果是一个字段,我可以使用
contains
,但是对于多个字段,我应该怎么做

数据库表中的“我的结果”应与上面的列表匹配,并有两列匹配
EmployeeId
&
EntryDate

逻辑上,您需要的是:

var query = db.Table.Where(e => list.Any(le => e.EmployeeId == le.EmployeeId &&
                                               e.EntryDate == le.EntryDate));
我不知道这是否适用于实体框架,但值得一试。(例如,在LINQ to对象中就可以了。)

从逻辑上讲,您需要的是:

var query = db.Table.Where(e => list.Any(le => e.EmployeeId == le.EmployeeId &&
                                               e.EntryDate == le.EntryDate));

我不知道这是否适用于实体框架,但值得一试。(例如,在LINQ to Objects中就可以了。)

您可以通过
实现这一点。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 }));

但是,这会生成SQL,该SQL在
列表中的每个项都有两个参数。500条记录的性能如何,您必须进行测试。如果这不起作用,您可以使用表值参数编写存储过程。

您可以通过
实现这一点。包含
运算符和匿名类型的方式与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 }));


但是,这会生成SQL,该SQL在
列表中的每个项都有两个参数。500条记录的性能如何,您必须进行测试。如果这不起作用,您可以编写一个带有表值参数的存储过程。

列表中只有一个条目—不清楚为什么要使用列表。如果你能提供一份工作,那会有帮助的。我还强烈建议不要使用字符串来存储日期。有很多条目。我只举了一个例子。列表中有500多条记录。如果一个示例能够实际演示您需要的内容,那么它将非常有用—在本例中,只有两条条目就足以说明问题。(将集合初始值设定项与对象初始值设定项一起使用会更清楚。)现在,您还没有告诉我们如何查询表。这是LINQ到SQL吗?EF?还有别的吗?内存中的表?可能与我编辑过的示例代码重复,使用集合和对象初始值设定项使其更具可读性和有效性(您以前的代码实际上无法编译,因为您多次声明了同一个局部变量,并且没有对其进行有效的缩进-在编写问题时请注意这类事情)。列表中只有一个条目-根本不清楚为什么要使用列表。如果您提供一个列表,这会有所帮助。我还强烈建议不要使用字符串来存储日期。有很多条目。我只举了一个例子。列表中有500多条记录。如果一个例子实际演示了在您需要的时候-在本例中,只需两个条目就足够了(将集合初始值设定项与对象初始值设定项一起使用将使其更加清晰)现在,您还没有告诉我们您是如何查询表的。这是LINQ到SQL的吗?EF?其他什么?内存中的表?可能与我编辑的示例代码重复,以使用集合和对象初始值设定项使其更具可读性和有效性(您以前的代码实际上无法编译,因为您多次声明了同一个局部变量,并且没有对其进行有效的缩进-在编写问题时请注意这类事情)。如果您可以用SQL表示它,它将与LINQ to EF一起工作。这个不会。您可以创建一个表值参数。这是ORM过度使用的明显迹象。存储过程将better@PanagiotisKanavos:我建议您添加一个答案,然后我将删除此答案。@JonSkeet谢谢。我将尝试此代码并让您知道。!如果您能表达出来的话在SQL中,它将与LINQ to EF一起工作。这一个不会。您可以创建一个表值参数。这是ORM过度使用的明显标志。存储过程将是better@PanagiotisKanavos:我建议您添加一个答案,然后我将删除此答案。@JonSkeet谢谢。我将尝试此代码并让您知道。!谢谢您的回答Tim。但在另一个场景中o如果我不想查询表,而是要查询列表,那么这是否可行?您的意思是“此查询是否可以在内存中以及通过SQL进行”?那么,是的。我收到的上述代码错误如下:-委托系统。Func不接受1个参数。这对我不起作用(EF6)-我得到一个System.NotSupportedException:'无法创建类型为'Anonymous type'的常量值。在此上下文中仅支持基元类型或枚举类型。'我缺少什么?@Tyson此答案可能特定于SQL Server。如果您使用的是另一个数据库,则为YMMV。感谢您的回答Tim。但在另一种情况下,如果我想查询不在表中,但在列表中,则此操作是否有效?您的意思是“此查询是否在内存中以及通过SQL工作”?然后,是的。以上代码的错误为:-委托系统。Func不接受1个参数。这对我不起作用(EF6)-我得到一个System.NotSupportedException:“无法创建类型为”的常量值Anony