Linq IN语句从列表中排除

本文关键字:排除 列表 IN 语句 Linq | 更新日期: 2023-09-27 18:01:52

我有两个表

Id | StartDate | EndDate

ExcludedContracts

Id | ContractId

我使用以下语句来获取两组数据:

            var excludedContracts = from Excluded in 
            DataContext.ExcludedTransportContracts
                                    select Excluded;
            // Get a collection of all live sites first
            var liveContracts = from Contracts in DataContext.Contracts
                                where Contracts.EndDate > DateTime.Now
                                select Contracts;

我需要选择在ExcludedContracts表中没有记录的所有合同。我一直在与WHERE查询斗争一段时间,但没有运气。

我如何做一个查询类似于我将在(1,2,3)SQL的安装?

谢谢!

Linq IN语句从列表中排除

我不知道你在使用哪个查询提供程序,但如果查询提供程序支持Contains方法,你可以使用这个:

//get all contracts that haven't been excluded
var nonExcludedContacts = liveContracts.Where(l => !excludedContracts.Contains(l));

如果不支持该方法,则可以使用Any方法。它不是很好读,但它完成了工作:

//get all contracts that haven't been excluded
var nonExcludedContacts = liveContracts.Where(l => !excludedContracts.Any(e => e.ContractId == l.Id));

这两个表在数据级别上不相关吗?是否有一个合同对象的列表ExcludedTransportContracts作为属性?

从数据来看,这可能是它们应该如何相关的,然后你可以做var liveContract = DataContext.Contracts.Where(c => c.ExcludedTransportContracts.Count() == 0 && c.EndDate > DateTime.Now )

是我的头,所以代码可能需要稍微修改。

in在LINQ中的等效包含http://msdn.microsoft.com/en-us/library/system.linq.enumerable.contains.aspx但是你也应该看看LINQ除了方法http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx

Update:如上所述,这些是IEnumerable的,所以应该是http://msdn.microsoft.com/en-us/library/bb341422.aspx for contains, http://msdn.microsoft.com/en-us/library/bb348938.aspx for except for Queryable

试试这样做。显然,如果使用"Contains"方法,应该比较相似的数据类型/对象。

在包含函数中使用隐式类型变量时,编译器可能不会编译代码,但我不确定。

List<Contracts> excludedContracts = 
            (from Excluded in DataContext.ExcludedTransportContracts
             select Excluded).toList();
List<Contracts> liveContracts = 
    (from Contracts in DataContext.Contracts
     where Contracts.EndDate > DateTime.Now &&
            !excludedContracts.Contains(Contracts)
     select Contracts).toList();

此任务可以使用Enumerable.Contains()函数