我正在尝试创建一个利用来自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.
这是目前的尝试:
GameController.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;
}
GameViewModel.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; }
}
Game.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字段,这可能吗?
答案 0 :(得分:0)
对Linq查询使用延迟执行可能更好。也许调用ToList()方法,然后创建GameViewModel对象。
答案 1 :(得分:0)
我在阅读了Martins评论后解决了这个问题,我在game.cs实体中添加了一个外键引用,允许访问相关的开发者数据。
GameController.cs
DeveloperName = r.Developer.Name
game.cs
public int DeveloperId { get; set; }
[ForeignKey("DeveloperId")]
public Developer Developer { get; set; }