使用 2 个表实现 ASP.NET MVC5 搜索功能

Posted

技术标签:

【中文标题】使用 2 个表实现 ASP.NET MVC5 搜索功能【英文标题】:Implement ASP.NET MVC5 search functionality using 2 tables 【发布时间】:2021-12-28 11:30:50 【问题描述】:

我创建了两个表:Claim 和 ClaimAttachments。 我正在尝试在 ClaimID 上加入它们,以便从两个表中获取过滤后的数据。

public ActionResult Index(int?search)

        if (search!=null)
        
            var Product = (from P in db.Claims
                           join C in db.ClaimAttachments on
                           P.ClaimID equals C.ClaimID

                           select new Claim
                           
                               ClaimID = P.ClaimID,
                               ClaimBatchID = P.ClaimBatchID,
                               PatientControlNumber = P.PatientControlNumber,
                               PatientFirstName = P.PatientFirstName,
                               PatientLastName = P.PatientLastName,
                               ServiceFromDate = P.ServiceFromDate,
                               ServiceToDate = P.ServiceToDate,
                           );
             return View(db.Claims.Where(x => x.ClaimID == search).ToList());
           

        
        
        else
        
            return View(db.Claims.ToList());
        

我可以从单个表中获取搜索结果。连接不起作用。

【问题讨论】:

“不工作”究竟是什么方式?您观察到的实际问题是什么? 代替视图(db.Claims.Where(x => x.ClaimID == search).ToList());做查看(Product.Where(x => x.ClaimID == search).ToList()); @David,当我运行搜索过滤器时。结果仅显示在 Claims 表中,但我想要两个表的组合结果。 我做了 Product.Where(x => x.ClaimID == search).ToList());也是,但仍然没有从另一个表中获得过滤结果。 @CodeCademy:看起来您只是从一个表中选择db.Claims.Where(x => x.ClaimID == search).ToList()您希望看到其他表的哪些数据,为什么?即使在上面的代码行中,您也只能从Claims 表中选择任何数据(然后永远不要使用该查询的结果)。您希望从哪个表中查看数据,为什么?当您在该查询中加入表时,您希望从这两个表中select 哪些数据? (目前您只能从 一个 表中进行选择。) 【参考方案1】:

目前您仅从Claims 数据中进行选择:

return View(db.Claims.Where(x => x.ClaimID == search).ToList());

您在该代码行上方有一个join 查询:

var Product = (from P in db.Claims
               join C in db.ClaimAttachments on
               P.ClaimID equals C.ClaimID

               select new Claim
               
                   ClaimID = P.ClaimID,
                   ClaimBatchID = P.ClaimBatchID,
                   PatientControlNumber = P.PatientControlNumber,
                   PatientFirstName = P.PatientFirstName,
                   PatientLastName = P.PatientLastName,
                   ServiceFromDate = P.ServiceFromDate,
                   ServiceToDate = P.ServiceToDate
               );

但是您不会对该查询的结果做任何事情。听起来您的意思是使用该查询的结果(在 Product 变量中,顺便说一下,它可能应该有一个 复数 名称,因为它是一个集合)代替只是从db.Claims 中选择。像这样的:

return View(Product.Where(x => x.ClaimID == search).ToList());

但请注意,您仍然只是从 一个 表中选择数据。尽管join 操作可能会改变该选择的结果。但是选择本身就在这里:

select new Claim

    ClaimID = P.ClaimID,
    ClaimBatchID = P.ClaimBatchID,
    PatientControlNumber = P.PatientControlNumber,
    PatientFirstName = P.PatientFirstName,
    PatientLastName = P.PatientLastName,
    ServiceFromDate = P.ServiceFromDate,
    ServiceToDate = P.ServiceToDate

注意选择的每个值都来自P 别名,该别名在此处定义:

from P in db.Claims

所以您成功地连接了这两个表,但只从这两个表之一中选择数据。如果您还想从另一个表中选择数据,那么,您需要从另一个表中选择数据。例如,如果该表上有一个名为 SomeProperty 的属性您要选择,那么您需要选择它,然后将其选择到一个具有该属性的对象中。

例如,您可以创建一个视图模型(我们称之为ClaimViewModel 为例),它表示两个表的组合记录,其中包含您想要的每个表的属性。然后你会选择该类型:

select new ClaimViewModel

    ClaimID = P.ClaimID,
    ClaimBatchID = P.ClaimBatchID,
    PatientControlNumber = P.PatientControlNumber,
    PatientFirstName = P.PatientFirstName,
    PatientLastName = P.PatientLastName,
    ServiceFromDate = P.ServiceFromDate,
    ServiceToDate = P.ServiceToDate,
    SomeProperty = C.SomeProperty // <--- here

这会将 组合 数据选择到 ClaimViewModel 对象列表中,然后您将根据您的“搜索”对其进行过滤并返回到您的视图,就像使用 @987654336 一样@对象现在。当然,该视图需要更新以期待 ClaimViewModel 对象的集合,而不是 Claim 对象的集合。

【讨论】:

以上是关于使用 2 个表实现 ASP.NET MVC5 搜索功能的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC5 实现 SQL 查询工具

asp.net mvc5实现单点登录

ASP.NET MVC5+EF6搭建三层实例

在 ASP.NET MVC5 中传递给控制器​​时,DateTime 字段为空

asp.net mvc5 如何控制没有权限的页面不显示

如何在 Asp.Net MVC5 中使用 Ajax 将数据库更改保存到拖放列表