我有一个成员对象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记录的正确方法是什么?
答案 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 == ...