MVC 4和LINQ查询在ViewModel中使用2个实体

时间:2013-02-02 00:36:54

标签: c# asp.net-mvc linq entity-framework

我正在尝试创建一个利用来自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字段,这可能吗?

2 个答案:

答案 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; }