通过另一个变量的结果过滤结果?

时间:2019-03-18 20:29:50

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

我正在尝试将联系人管理器应用程序作为主应用程序的一部分,而此时我需要一些建议。我有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();

但是,我对现在如何得出结果并使用此结果过滤联系人感到困惑。

任何帮助将不胜感激。如果您对以上内容有任何疑问,请通过文本告诉我们。

3 个答案:

答案 0 :(得分:0)

var contacts = _context.AssignedContacts.Where(ac => ac.ReferenceCaseID == id)
    .Join(_context.Contacts, assigned => assigned.ContactID, contact => contact.ID,        
        (assigned, contact) => contact);

我无法测试它,因为我没有完整的代码,但是从根本上讲,您从所做的事情开始-过滤AssignedContacts表。

然后根据两个表中的ContactsContactID键将结果与ID表联接。

最后,选择结果联接的联系人。


或者,您可以联接表,然后进行过滤:

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表开始,然后根据两个表中的AssignedContactsID键将其与ContactID表联接。

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

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

答案 1 :(得分:0)

您必须加入“分配的联系人”和“联系人”这两个实体之间的联系人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();

答案 2 :(得分:0)

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

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);
    }