我有两张桌子
合同
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的查询?
谢谢!
答案 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();