传递一个 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);

pList&lt;string&gt;(由于您的 LINQ 查询选择了单个字符串并将其与另一个选择的单个字符串联合)但您承诺它会收到一个视图

@model IEnumerable<Document_Management_System.Models.Document>

文档不是字符串(不是文档)。您需要重塑您的 LINQ,以便它生成一个可枚举的 Document。现在它得到一堆文档名称(一个字符串):

select doc.DocumentName

还有一堆照片的名字..

select pho.PhotoName

并将它们结合在一起

您最终可能会使用 Concat 而不是 Union,但主要是您可能需要调整查询,以便将照片转换为文档。. 除非名称列表当然适合您的目的 100 % 在这种情况下,调整您的 @model 声明以承诺 IEnumerable&lt;string&gt;

我个人认为我会有一个全新的类,而不是 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 查询以查看的主要内容,如果未能解决你的问题,请参考以下文章

如何将 sql union 转换为 linq

如何使用 LINQ 将表列查询到数组中

在 ASP.NET MVC 中向控制器传递多个参数;此外,在 LINQ-to-SQL 中生成动态查询

LINQ to SQL 执行联合和左外连接

如何将参数从 LINQ 查询传递到 SQL 视图?

从LINQ到SQL获取SQL查询?