使用 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 搜索功能的主要内容,如果未能解决你的问题,请参考以下文章