C# 不匹配行的linq查询

C# 不匹配行的linq查询,c#,asp.net,linq,C#,Asp.net,Linq,我想知道如何执行返回不匹配行的查询 例如:查询应该返回自给定日期以来没有租过任何电影的人的列表 我写了这段代码,但我得到了每句话的帮助 事先谢谢你,米莎 // dt is a date from the user public IEnumerable inActiveRenters(DateTime dt) { var rents = from r in myDb.Rents where r.RentStart > dt

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

例如:查询应该返回自给定日期以来没有租过任何电影的人的列表

我写了这段代码,但我得到了每句话的帮助

事先谢谢你,米莎

// 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;
    }
//dt是来自用户的日期
公共IEnumerable不活动输入(日期时间dt)
{
var租金=从myDb中的r租金
其中r.RentStart>dt
选择r;
列表成员列表=新列表();
foreach(myDb.Members中的成员m)
{
bool notRent=true;
foreach(租金中的租金)
{
if(r.MemberID==m.MemberID)
{
notRent=假;
}
}
如果(不包括租金)
{
成员名单。添加(m);
}
}
var list=来自成员列表中的m
选择新的{m.MemberID,m.FirstName};
退货清单;
}
这应该可以:

from r in myDb.Rents.Where(p => !myDB.Members.Any(m => m.MemberID == p.MemberID))
where r.RentStart > dt
select r;
这应该起作用:

from r in myDb.Rents.Where(p => !myDB.Members.Any(m => m.MemberID == p.MemberID))
where r.RentStart > dt
select r;
myDb.Members
.加入(myDb.Rents)
其中(r=>r.RentStartm.MemberID,
r=>r.MemberID,
(m,r)=>m);
myDb.Members
.加入(myDb.Rents)
其中(r=>r.RentStartm.MemberID,
r=>r.MemberID,
(m,r)=>m);
Micha

好吧,有“几种”方法可以做到这一点,具体取决于您使用的数据库

  • 左连接,其中为NULL。比如说

    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)

    干杯。基思。

    米卡

    好吧,有“几种”方法可以做到这一点,具体取决于您使用的数据库

  • 左连接,其中为NULL。比如说

    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)


    干杯。基思。

    未租用任何电影的会员:

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

    未租用任何电影的成员:

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

    TSQL中的所有有效答案,但我认为我们在寻找Linq解决方案是的,在事实发生后我发现了这一点。。。我不是很聪明;-)TSQL中的所有有效答案,但我认为我们在寻找Linq解决方案是的,在事实发生后我发现了这一点。。。我不是很聪明;-)