我想知道如何执行返回无匹配行的查询。
例如:查询应返回自给定日期以来尚未租借任何电影的人员列表。
我写了这段代码,但我得到了一个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;
}
答案 0 :(得分:2)
尚未租借任何电影的会员:
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 });
答案 1 :(得分:1)
这应该有效:
from r in myDb.Rents.Where(p => !myDB.Members.Any(m => m.MemberID == p.MemberID))
where r.RentStart > dt
select r;
答案 2 :(得分:1)
myDb.Members
.Join(myDb.Rents
.Where(r => r.RentStart < dt),
m => m.MemberID,
r => r.MemberID,
(m, r) => m);
答案 3 :(得分:1)
米莎,
AFAIK有“一些”方法可以做到这一点,取决于你正在使用哪个数据库。
LEFT JOIN WHERE NULL。例如
SELECT c.*
FROM customer c
LEFT JOIN rentals r
ON r.cutomer_id is null
WHERE r.date >= ${theCutOffDate}
NOT EXISTS
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。)
干杯。基思。