【问题标题】:How to check if a child table contains a particular record如何检查子表是否包含特定记录
【发布时间】:2014-01-15 13:15:56
【问题描述】:

我有一个成员对象 objMember。我从 LINQ 得到它

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

会员有注册 - 一个链接 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 记录的正确方法是什么?

【问题讨论】:

  • 您指的是哪个“LINQ”? LINQ to SharePoint?
  • 我认为这对语法无关紧要,但它是 ASP.NET 项目中的 LINQ to SQL。

标签: c# sql linq parent-child contains


【解决方案1】:

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

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

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

另一种选择是对查询中的两个表执行显式join。这将撤回您需要的数据。

还有你的测试:

If objMember.SignUps.Contains(su) Then

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

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

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

【讨论】:

  • 这正是我想要的! objMember.Signups.Any。作为新手,我没有想到查询我已经在内存中拥有的实际集合。谢谢!
【解决方案2】:

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

您可以使用 overload of contains 来指定 ClassID 和 MemberID,或者使用其他 LINQ 表达式,例如

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

【讨论】:

  • 也感谢您澄清为什么我使用 Contains 的方式不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2014-01-09
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
相关资源
最近更新 更多