linq查询没有匹配的行

时间:2011-04-30 11:50:32

标签: c# asp.net linq

我想知道如何执行返回无匹配行的查询。

例如:查询应返回自给定日期以来尚未租借任何电影的人员列表。

我写了这段代码,但我得到了一个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;
    }

4 个答案:

答案 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有“一些”方法可以做到这一点,取决于你正在使用哪个数据库。

  1. LEFT JOIN WHERE NULL。例如

    SELECT c.* 
    FROM customer c 
    LEFT JOIN rentals r 
    ON r.cutomer_id is null 
    WHERE r.date >= ${theCutOffDate}
    
  2. NOT EXISTS

    SELECT c.* 
    FROM customer c 
    WHERE NOT EXISTS(
      SELECT 1 
      FROM rentals 
      WHERE date >= ${theCutOffDate}
    )
    
  3. 不在

    SELECT c.* 
    FROM customer c 
    WHERE c.customer_id NOT IN(
      SELECT customer_id
      FROM rentals 
      WHERE date >= ${theCutOffDate}
    )
    
  4. 请注意:我可能还有很多未见过的方法。

    选项1:left join可能是最均匀支持的,所以我推荐它(在没有其他相关信息的情况下,比如你正在使用的freeken RDBMS。)

    干杯。基思。