C# 在LINQ中使用等效函数获取复杂对象

C# 在LINQ中使用等效函数获取复杂对象,c#,linq,C#,Linq,我有一个客户类型的列表。我需要在数据库中插入列表的所有值,然后再检查该特定客户端是否存在具有相同客户编号的客户。 为此,我启动了一个查询,以获取数据库中客户编号与列表中客户编号相等的所有客户。我正在编写的查询不起作用,下面是代码 CustomerRepository.Find(x => x.ClientId == clientId) .Where(x => x.CustomerNumber.Contains(lstCustomersInserted.Selec

我有一个客户类型的列表。我需要在数据库中插入列表的所有值,然后再检查该特定客户端是否存在具有相同客户编号的客户。 为此,我启动了一个查询,以获取数据库中客户编号与列表中客户编号相等的所有客户。我正在编写的查询不起作用,下面是代码

CustomerRepository.Find(x => x.ClientId == clientId)
            .Where(x => x.CustomerNumber.Contains(lstCustomersInserted.Select(c => c.CustomerNumber)));

我想你把它倒过来了。尝试反转包含的内容

编辑:我切换到使用基于注释的泛型谓词Exists而不是Contains,因此您可以匹配属性

CustomerRepository.Find(x => x.ClientId == clientId)
            .Where(x => lstCustomersInserted.Exists(c => x.CustomerNumber == c.CustomerNumber));
保持简单:

var lstCustomerNumbers = lstCustomersInserted.Select(c => c.CustomerNumber);    
var res = CustomerRepository.Where(x => x.ClientId == clientId && lstCustomerNumbers.Any(c => c == x.CustomerNumber));

除了之外的
怎么样

CustomerRepository.Select(x => x.ClientID)
                  .Except(lstCustomersInserted.Select(x => x.CustomerID));

这将返回您的
lstCustomersInserted

中不存在的repo中对象的ID,告诉我们具体出了什么问题。什么类型是
x.CustomerNumber
?您可能想执行
lstCustomersInserted.Contains(x.CustomerNumber)
运行此代码时,您的系统动态产生一些噪音?这不是
Contains
的工作方式。它应该是
lstCustomersInserted.Contains(x.CustomerNumber)
。或将其更改为
Any
。已修复。我只是没有在本地运行代码来验证特定的方法签名。请注意,如果
lstCustomersInserted
是一个
列表
,则存在一个本机
包含
vs使用Linq
包含
,如果它不是列表,则
存在
将不起作用。最好使用
Contains
来涵盖所有可能的实现。但它是一个复杂对象的列表,而不是一个简单字符串的列表。包含也不起作用。CustomerNumber是列表中对象的一个属性,也是iQueryTable中对象的一个属性,至少我从最初的问题中了解到了这一点。