如何检查子表是否包含特定记录

时间:2013-12-27 23:35:48

标签: c# sql linq parent-child contains

我有一个成员对象objMember。我是从LINQ获得的

  Dim objMember = (From m In db.Members
      Where m.LoginName = System.Web.HttpContext.Current.User.Identity.Name
      Select m).First

会员拥有SignUps - 一个多对多表,用于链接MemberID和ClassID

我有一个ClassID - 一个整数

似乎我应该能够查询objMember.SignUps,看看它是否有一个用于objMember.MemberID + ClassID。而且似乎我不应该再次查询数据库以获得这个答案。当我破坏我的代码并检查objMember.SignUps时,我发现它似乎将它们存在于内存中。

我试过这个,但它总是返回False。

 Dim su As New SignUp
 su.ClassID = ClassID
 su.MemberID = objMember.MemberID
 If objMember.SignUps.Contains(su) Then

检查objMember.SignUps以查看它是否有特定的SignUp记录的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您必须先设置查询的加载选项:

DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Member>(m => m.SignUps);
db.LoadOptions = dlo;

否则延迟加载查询将不会加载子选项。对要使用主查询加载的每个子对象执行此操作。

另一种方法是在查询中的两个表上执行显式join。这将撤回您需要的数据。

也是你的测试:

If objMember.SignUps.Contains(su) Then

错了。这是检查您创建的对象是否在列表中 - 它不是。您需要使用Any方法:

If objMember.SignUps.Any(s => s.ClassID == ClassID && s.MemberID == objMember.MemberID) Then

这将检查集合中是否存在具有这些属性的任何对象。

答案 1 :(得分:1)

由于Contains会进行对象比较以查看objMember.Signups是否有su,因此这将始终返回false。

您可以使用包含overload的内容来指定ClassID和MemberID,也可以使用其他LINQ表达式,例如

From s in signups
Where s.ClassID == ... && s.UserID == ...