传递一个 Union Linq 查询以查看
Posted
技术标签:
【中文标题】传递一个 Union Linq 查询以查看【英文标题】:Pass a Union Linq query to view 【发布时间】:2021-11-14 16:30:52 【问题描述】:我有这两张表,一张是文件,一张是照片。因此用户可以将文档或图片添加到数据库中。从数据库中检索数据时,我使用了联合查询。这是我使用的 SQL 查询
SELECT D.* FROM Documents D
WHERE D.AddedBy = 'John'
UNION
SELECT P.* FROM Photos P
WHERE P.AddedBy = 'John'
我需要将其转换为 Linq。
var p = (from doc in _context.Documents
where doc.AddedBy == LogonUsername
select doc.DocumentName).Union
(from pho in _context.Photos
where pho.AddedBy == LogonUsername
select pho.PhotoName).ToList();
Linq 查询工作正常。当我将它传递给视图时,它给了我这个错误。
The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[System.String]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[Document_Management_System.Models.Document]'.
我认为我使用的模型是错误的。
这是控制器
public ActionResult Test()
var p = (from doc in _context.Documents
where doc.AddedBy == LogonUsername
select doc.DocumentName).Union
(from pho in _context.Photos
where pho.AddedBy == LogonUsername
select pho.PhotoName).ToList();
return View(p);
观点
@model IEnumerable<Document_Management_System.Models.Document>
@
ViewBag.Title = "Test";
<h2>Test</h2>
<div class="panel-body">
<table class="zebra">
<tr>
<th>@html.DisplayNameFor(model => model.DocumentName)</th>
</tr>
@foreach (var item in Model)
<tr>
<td>
@Html.DisplayFor(modelItem => item.DocumentName)
</td>
</tr>
</table>
</div>
请帮我解决这个问题。谢谢。
【问题讨论】:
【参考方案1】:你已经完成了
return View(p);
而p
是List<string>
(由于您的 LINQ 查询选择了单个字符串并将其与另一个选择的单个字符串联合)但您承诺它会收到一个视图
@model IEnumerable<Document_Management_System.Models.Document>
文档不是字符串(不是文档)。您需要重塑您的 LINQ,以便它生成一个可枚举的 Document。现在它得到一堆文档名称(一个字符串):
select doc.DocumentName
还有一堆照片的名字..
select pho.PhotoName
并将它们结合在一起
您最终可能会使用 Concat 而不是 Union,但主要是您可能需要调整查询,以便将照片转换为文档。. 除非名称列表当然适合您的目的 100 % 在这种情况下,调整您的 @model 声明以承诺 IEnumerable<string>
我个人认为我会有一个全新的类,而不是 Document,它跟踪照片和文档之间的共同属性(名称?由用户创建?上传日期?大小?批准?在 db 中的 ID?)加上一个可枚举的说明它是照片还是文档(如果在 Ui 中显示不同的图标很重要),我会保证 @model 是 那个 新类的可枚举,称之为 FileViewModel 或其他东西..
【讨论】:
【参考方案2】:只需修复模型并查看项目
@model List<string>
<th> Photo Names</th>
</tr>
@for (var i=0; i<Model.Count; i++)
<tr>
<td>
@Html.DisplayFor(model => model[i])
</td>
</tr>
</table>
【讨论】:
以上是关于传递一个 Union Linq 查询以查看的主要内容,如果未能解决你的问题,请参考以下文章