1

我正在尝试创建一个使用来自 2 个独立实体的数据的 ViewModel。我希望我的 ViewModel 显示来自 Game 类的所有数据,并从 Developer 模型附加相应的 developerName 值。

我正在使用来自游戏类的数据填充模型变量,并尝试通过调用一个辅助方法来包含开发人员的姓名,该方法在提供 ID 时输出开发人员的姓名。

这当然行不通,LINQ 查询将失败并出现 NotSupportedException 说明:

LINQ to Entities does not recognize the method 'System.String GetDeveloperNameFromId(Int32)' method, and this method cannot be translated into a store expression.

这是当前的尝试:

游戏控制器.cs

            var model = _db.Games
                .OrderByDescending(r => r.Name)
                .Select(r=> new GameViewModel
                    {
                        Id = r.Id,
                        Name = r.Name,
                        Rating = r.Rating,
                        ReleaseDate = r.ReleaseDate,
                        Type = r.Type,
                        DeveloperId = r.DeveloperId,
                        DeveloperName = GetDeveloperNameFromId(r.DeveloperId)       
                    })
.Where(r => searchTerm == null || r.Name.StartsWith(searchTerm));

        private string GetDeveloperNameFromId(int id)
        {
            var _model = _db.Developers.FirstOrDefault(r => r.Id.Equals(id));
            string _name = _model.Name;
            return _name;
        }

游戏视图模型.cs

public class GameViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Rating { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string Type { get; set; }
    public string DeveloperName { get; set; }
    public int DeveloperId { get; set; }
}

游戏.cs

public class Game
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Rating { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string Type { get; set; }

    [Display(Name = "Developer")]
    public int DeveloperId { get; set; }
}

我确定有更好的方法来添加开发人员姓名,可能是使用连接 LINQ 查询,或者可能修改模型变量的范围以包含多个实体?

更好的是在 ViewModel 中自动填充 DeveloperName 字段,这可能吗?

4

2 回答 2

0

也许最好对 Linq 查询使用延迟执行。也许调用 ToList() 方法然后创建 GameViewModel 对象。

于 2013-02-02T00:45:20.677 回答
0

我在阅读 Martins 的评论后解决了这个问题,我添加了一个对 game.cs 实体的外键引用,它允许访问相关的开发人员数据。

游戏控制器.cs

DeveloperName = r.Developer.Name

游戏.cs

public int DeveloperId { get; set; }

[ForeignKey("DeveloperId")]
public Developer Developer { get; set; }
于 2013-02-02T11:49:47.890 回答