2011-04-30 130 views
0

我想知道如何做一個查詢,返回沒有匹配的行。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; 
    } 

回答

1

這應該工作:

from r in myDb.Rents.Where(p => !myDB.Members.Any(m => m.MemberID == p.MemberID)) 
where r.RentStart > dt 
select r; 
1
myDb.Members 
     .Join(myDb.Rents 
        .Where(r => r.RentStart < dt), 
      m => m.MemberID, 
      r => r.MemberID, 
      (m, r) => m); 
+0

謝謝你們。 – micha 2011-04-30 14:35:20

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. NOT IN

    SELECT c.* 
    FROM customer c 
    WHERE c.customer_id NOT IN(
        SELECT customer_id 
        FROM rentals 
        WHERE date >= ${theCutOffDate} 
    ) 
    

請注意:有很好可能是我沒見過的方式(還)。

備選方案1:left join可能是最均勻很好的支持,所以我推薦它

乾杯(在沒有其他pertinant信息,你使用像這freeken RDBMS)。基思。

+1

在TSQL中的所有有效答案,但我認爲我們是在Linq解決方案之後 – RichardW1001 2011-04-30 14:09:31

+1

是的,我有點認爲在事實之後......我不太聰明;-) – corlettk 2011-04-30 14:25:22

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 });