如果两列匹配,尝试使用Join返回列表

时间:2016-10-02 20:33:28

标签: asp.net-mvc linq

我有两张桌子,图片和用户。如果UserID与Users表中的ID匹配,我想返回一个Image。 UserID不是FK,其值在上传照片时存储在数据库中,以及模型中的其他属性。

以下是加入代码:

    [HttpGet]
    public List<Image> GalleryOnProfilePage()
    {
        return (from u in db.Users
                join i in db.Images on u.Id equals i.UserID
                where u.Id == i.UserID
                select new
                {
                    ImageID = i.ImageID
                }).Select(x => new Image 
                { 
                    ImageID = x.ImageID
                }).ToList();
    }

现在我甚至不知道这段代码是否有用并返回符合我愿望的图片:Image.UserID == Users.ID return ImageID。我坚持以下错误:

  

实体或复杂类型&#39; JobSite3.Models.Image&#39;不能在LINQ to Entities查询中构造。

以下是视图:

@model List<JobSite3.Models.Image> 

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

<table class="table-striped">
    @{
        int j = 0;
        for (int i = 0; i < Model.Count(); i += 1)
        {
            j = i;
            <tr>
                @while (j < i + 1 && j < Model.Count())
                {
                    <td>
                        <img src="data:image/png;base64,@Convert.ToBase64String(Model[j].ImageData,0,Model[j].ImageData.Length)" width="100" />
                    </td>
                    j++;
                }
            </tr>
        }
    }
</table>
}

非常感谢您的支持

1 个答案:

答案 0 :(得分:1)

正如@ChrisF所说,你们已经按照相同的栏目加入了。但是这里你的问题不是加入。该异常表明无法在自定义select语句中构造实体本身。在您的查询中,您尝试使用以下代码行选择新的Image}).Select(x => new Image ...。但 Linq中不允许实体,因为Image是实体类型。你有两个解决方法。

首先(推荐)

由于您只是选择Id,只需返回 ID列表

return (from u in db.Users
    join i in db.Images on u.Id equals i.UserID
    where u.Id == i.UserID
    select i.ImageID)
    .ToList();

第二

或者您可以在选择AsEnumerable之前使用Image函数将数据加载到内存中:

return (from u in db.Users
    join i in db.Images on u.Id equals i.UserID
    where u.Id == i.UserID
    select new
    {
        ImageID = i.ImageID
    })
    .AsEnumerable() // Load data into memory
    .Select(x => new Image 
    { 
        ImageID = x.ImageID
    }).ToList();