实体框架:在include中选择新属性

时间:2017-11-15 17:06:59

标签: c# asp.net entity-framework

让我们说,我有一个名为Solutions的实体,它有多个多媒体。我想查询解决方案并检索他们的多媒体列表,但我还想选择一些字段并推断其他多媒体中的其他字段,如下所示:

IQueryable<Solution> result = db.Solutions
                .Include(s => s.Multimedia.Select(m => new MultimediaViewModel(){
                    ID = m.ID,
                    Name = m.Name,
                    Path = m.Path,
                    Preview = MultimediasController.ConvertVideo(m),
                    Extension = MultimediasController.GetExtension(m),
                    Type = m.Type
                }))

以下内容给出了带有消息的System.ArgumentException异常:&#34; Include路径表达式必须引用在该类型上定义的导航属性。使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性。&#34;

这是如何实现的?

预期的反应将是这样的:

[
    {
        "id": 2,
        "title": "Example",
        "subTitle": "Example 1",
        "multimedia": [
            {
                "id": 27,
                "name": "teste",
                "path": "/Upload_Public/Solution/27_.mp4",
                "preview": "/Upload_Public/Solution/27_preview.jpg",
                "extension": "mp4",
                "type": 0,
            }
        ],
    }
]

1 个答案:

答案 0 :(得分:0)

您不需要使用.Include。只需创建一个匿名对象,然后选择所需的属性。

IQueryable<Solution> result = db.Solutions
    .Select(s => new {
        s.Id,
        s.Title,
        s.Subtitle,
        Multimedia = new
        {
            s.Multimedia.ID,
            s.Multimedia.Name,
            s.Multimedia.Path,
            Preview = MultimediasController.ConvertVideo(m),
            Extension = MultimediasController.GetExtension(m),
            s.Multimedia.Type,
        }
    });

但是,方法调用可能会导致运行时错误,因为需要在数据库中评估整个语句。我不确定这些方法是做什么的,但您可能必须恢复原始数据,然后在客户端上提供数据后提取所需的信息。