Linq IN声明从列表中排除

时间:2011-07-13 12:33:09

标签: c# linq

我有两张桌子

合同

Id | StartDate |结束日期

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查询争斗一段时间,但没有运气。

如何进行类似于实例IN(1,2,3)SQL的查询?

谢谢!

5 个答案:

答案 0 :(得分:3)

我不知道您正在使用哪个查询提供程序,但如果该查询提供程序支持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));

答案 1 :(得分:2)

LINQ中的in equiv in包含http://msdn.microsoft.com/en-us/library/system.linq.enumerable.contains.aspx但是除了方法http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx之外你还应该看一下linq

更新:如上所述那些是IEnumerable,所以应该是http://msdn.microsoft.com/en-us/library/bb341422.aspx for contains和http://msdn.microsoft.com/en-us/library/bb348938.aspx for除了哪些是Queryable

答案 2 :(得分:2)

这两个表在数据级别上是否相关?即具有ExcludedTransportContracts列表作为属性的Contract对象?

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

这样的事情。

不在我头顶,因此代码可能需要稍作修改。

答案 3 :(得分:0)

您可以使用Enumerable.Contains()功能执行此任务。

答案 4 :(得分:0)

尝试这样的事情。显然,如果使用“Contains”方法,则应该比较类似的数据类型/对象。

在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();