繁体   English   中英

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

[英]How to check if a child table contains a particular record

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

您必须在创建之前设置查询的加载选项:

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

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

因为Contains将进行对象比较以查看objMember.Signups是否具有su ,所以它将始终返回false。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM