我想知道如何做一个查询,返回行没有匹配。
示例:查询应该返回自给定日期以来未租用任何电影的人员列表。
我写了这段代码,但是我得到了foreach句子的帮助。
谢谢你,micha。
// dt is a date from the user
public IEnumerable inActiveRenters(DateTime dt)
{
var rents = from r in myDb.Rents
where r.RentStart > dt
select r;
List<Member> memberList = new List<Member>();
foreach (Member m in myDb.Members)
{
bool notRent = true;
foreach (Rent r in rents)
{
if (r.MemberID == m.MemberID)
{
notRent = false;
}
}
if (notRent)
{
memberList.Add(m);
}
}
var list = from m in memberList
select new { m.MemberID, m.FirstName };
return list;
}
未租用电影的成员:
var rentsSinceDate = myDb.Rents.Where(r => r.RentStart > dt);
var notRentedAnyMovie = myDb.Members
.Where(m => !rentsSinceDate.Any(r => r.MemberID == m.MemberID))
.Select(m => new { m.MemberID, m.FirstName });
myDb.Members
.Join(myDb.Rents
.Where(r => r.RentStart < dt),
m => m.MemberID,
r => r.MemberID,
(m, r) => m);
Micha
我敢说有"几种"方法可以做到这一点,这取决于您使用的数据库。
-
左连接为空。例如
SELECT c.* FROM customer c LEFT JOIN rentals r ON r.cutomer_id is null WHERE r.date >= ${theCutOffDate}
-
不存在
SELECT c.* FROM customer c WHERE NOT EXISTS( SELECT 1 FROM rentals WHERE date >= ${theCutOffDate} )
-
在
SELECT c.* FROM customer c WHERE c.customer_id NOT IN( SELECT customer_id FROM rentals WHERE date >= ${theCutOffDate} )
请注意:很可能有我还没有看到的方法。
选项1:left join
可能是最一致的支持,所以我推荐它(在没有其他相关信息的情况下,比如您正在使用哪个freeken RDBMS)
欢呼。基斯。
应该可以:
from r in myDb.Rents.Where(p => !myDB.Members.Any(m => m.MemberID == p.MemberID))
where r.RentStart > dt
select r;