【问题标题】:Filter results via results of another variable?通过另一个变量的结果过滤结果?
【发布时间】:2019-03-19 20:44:13
【问题描述】:

我正在尝试将联系人管理器应用程序作为我的主应用程序的一部分,此时我需要一些建议。我有 2 张桌子专门用于管理联系人。

第一个表(联系人)包含每个联系人的主要信息: 字段:ID、名字、姓氏、电子邮件、电话、公司

第二个表是查找分配表 (AssignedContacts),其中包含要分配联系人的案例的参考 id 和联系人的 id: 字段:ID、ReferenceCaseID、ContactID

现在我正在尝试创建一个视图,该视图返回分配给案例的联系人列表。视图将接收 ReferenceCaseID 作为参数。

我被困在如何在控制器中编写代码来设置变量。

public ActionResult Contacts(int id)
    {

        var Contacts = <insert logic to filter contacts to just those assigned based on the parameter passed>

        if (Contacts == null)
            return HttpNotFound();

        return View(Contacts);
    }

我知道我可以使用以下方法获取已分配联系人的列表:

var AssignedContacts = _context.AssignedContacts.Where(c => c.ReferenceCaseID == id).ToList();

但老实说,我对现在如何获取该结果并使用它过滤联系人感到困惑。

非常感谢任何帮助。如果您对上述内容有任何疑问,请告诉我,因为很难通过文字来解释。

【问题讨论】:

  • 什么是_Context?如果是DbContext,那么您的问题与 Entity-Framework 而不是 asp.net-mvc 有关。
  • 问题很混乱,你能提供你的实体类吗?

标签: c# asp.net-mvc entity-framework


【解决方案1】:
var contacts = _context.AssignedContacts.Where(ac => ac.ReferenceCaseID == id)
    .Join(_context.Contacts, assigned => assigned.ContactID, contact => contact.ID,        
        (assigned, contact) => contact);

我无法测试它,因为我没有你的完整代码,但基本上,你从你所做的开始 - 过滤 AssignedContacts 表。

然后根据两个表中的ContactIDID 键将结果与Contacts 表连接。

最后,您选择结果加入的联系人。


或者,您可以加入表格然后过滤:

var contacts = _context.Contacts.Join(_context.AssignedContacts, contact => 
    contact.ID, assigned => assigned.ContactID, (contact, assigned) => 
        new { Contact = contact, ReferenceCaseID = assigned.ReferenceCaseID } )
    .Where(contactWithRefId => contactWithRefId.ReferenceCaseID == id);

这里从Contacts 表开始,并根据两个表中的IDContactID 键将其与AssignedContacts 表连接。

然后您创建一种新的匿名对象,它是具有ReferenceCaseID 的联系人(这意味着您可能有具有不同ReferenceCaseID 的重复联系人)。

最后,您使用where 通过ReferenceCaseID 过滤这些新的联系人对象,这将删除所有不相关的联系人。

【讨论】:

    【解决方案2】:

    您必须加入两个实体之间的联系人 ID,即分配的联系人和联系人,然后过滤您传入的参考 ID。

    未针对您的情况进行测试,但可以帮助您入门:

    var contactsMatching= (from c in dbContext.Contacts 
                     join ac in dbContext.AssignedContacts on 
                     c.ID equlas ac.ContactID
                     where ac.ReferenceCaseID==<your provided id>
                      select Contact{
                         ID = c.ID,
                         FirstName= c.FirstName,
                         ..snip..
                     }).ToList();
    

    【讨论】:

      【解决方案3】:

      感谢大家在上面的回答。我和我的一位朋友一起工作,并使用以下内容找到了我想要的东西:

      public ActionResult Contacts(int id)
          {
      
              var Contacts =
                      from contact in _context.Contacts
                      join assignedcontact in _context.AssignedContacts on contact.Id equals assignedcontact.ContactId
                      where assignedcontact.ReferenceCaseID == id
                      select contact;
      
              if (Contacts == null)
                  return HttpNotFound();
      
              return View(Contacts);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 2019-12-29
        • 2020-12-02
        • 2015-03-23
        • 1970-01-01
        • 2018-08-18
        • 1970-01-01
        相关资源
        最近更新 更多