Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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
C# 无法使用LINQ比较两个列表_C#_Linq_Lambda - Fatal编程技术网

C# 无法使用LINQ比较两个列表

C# 无法使用LINQ比较两个列表,c#,linq,lambda,C#,Linq,Lambda,我需要根据列值Id和Name比较两种列表类型。列表1包含名称和Id,列表2还包含Id、名称和其他列。现在我想检查一个输入名称在方法中接收的条件。该名称在List2中不存在,但可能存在于List1中。该条件应验证List1 Id在List2 Id中不存在,并且外部名称可能存在于List1中。为了实现这一点,我使用了下面的查询 var IsNameExists= db.List1.Where(a => List2.Any(b=>b.Id!=a.Id) && a.Name=

我需要根据列值Id和Name比较两种列表类型。列表1包含名称和Id,列表2还包含Id、名称和其他列。现在我想检查一个输入名称在方法中接收的条件。该名称在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”类型的常量值。在此上下文中仅支持基元类型或枚举类型

我不确定在我的问题上我做错了什么。请指导我如何实现这一点,以检查列表1中的名称是否存在

更正的问题和答案是:

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

我想,您可以这样做,基本上就是选择ID并将它们作为原语发送到SQL,以生成一个简单的SQL查询

这里的基本问题是试图将内存中的内容与LinqToSql混合在一起,LinqToSql本质上试图将语句转换为查询并在数据库上运行。数据库不会知道你的列表是否有内存,所以解决方法是要么给它一些它能理解的东西,要么在内存中执行。下面的示例提取ID,并向数据库提供它确实知道的信息,即int的列表

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

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

有吗?它不应该是db.List2.Any吗?List2.ToList.Anyb=>b.Id=a、 IdI添加了一个与您的问题相同的答案,只是一个小的更正。您的新代码正在做什么?它将该表的所有数据吸回内存,是的,这将在小表上工作,但是如果您有一个大表,这将是难以置信的缓慢和非常低效的。如果你意识到这一点,一切都很好:如果你愿意,你可以回答你自己的问题,如果这已经解决了你的问题,我想,用你的逻辑,这是很好的工作。我们能把这两行代码转换成一行查询吗?不。当我们与单个查询一起使用时,它会给出相同的异常。请将List2 ID转换为Hashset以提高处理效率,否则它位于^2右侧now@TheGeneral“你能回顾一下我的答案吗?”将军:我已经添加了收费表,但也给出了同样的例外。