首页 > 解决方案 > 无法使用 LINQ 比较两个列表

问题描述

我需要List根据其列值比较两种类型IdName. List1hasnamesids并且List2还包含Id,Name和其他列。现在我想检查一个输入名称在方法中接收的条件。该名称不存在,List2但它可能存在于List1。条件应验证List1 Id不存在,List2 Id并且外部名称可能存在于 List1 中。我已经使用下面的查询来实现这一点。

var IsNameExists= db.List1.Where(a => List2.Any(b=>b.Id!=a.Id) && a.Name== InputName).ToList();

当我使用这个查询时,我得到了像这样的异常

无法创建类型为“ProjectName.DBEntities.List2”的常量值。此上下文仅支持原始类型或枚举类型。

我不确定我在查询中做错了什么。请指导我如何实现这一点以检查 List1 上的名称存在。

更正的查询和答案是:

var IsNameExists= db.List1.ToList().Where(a => !(List2.Select(x => x.Id).Contains(a.Id) && a.Name== InputName).ToList();

标签: c#linqlambda

解决方案


我猜你可以做这样的事情,基本上它只是选择 ids 并将它们作为原语发送到 SQL 以制作一个很好的简单 sql 查询

这里的基本问题是试图将内存中的内容与 LinqToSql 混合,后者本质上试图将您的语句转换为查询并在数据库上运行它。数据库不会知道您有内存的列表,所以解决方法是给它一些它理解的东西或者在内存中做。下面的示例提取 ids,并为数据库提供它确实知道的东西,一个 int 列表

var ids = List2.Select(x => x.Id).ToList();

var IsNameExists= db.List1.Where(a => !ids.Contains(a.Id) && a.Name== InputName)
                         .ToList();

推荐阅读