1

2 つの別個のエンティティからのデータを利用する ViewModel を作成しようとしています。ViewModel で Game クラスのすべてのデータを表示し、対応する developerName 値を Developer モデルからアタッチしたいと考えています。

モデル変数にゲーム クラスのデータを入力し、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; }
}

ゲーム.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

Martins のコメントを読んだ後、これを解決しました。関連する開発者データへのアクセスを許可する game.cs エンティティへの外部キー参照を追加しました。

GameController.cs

DeveloperName = r.Developer.Name

ゲーム.cs

public int DeveloperId { get; set; }

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

おそらく、Linq クエリには遅延実行を使用する方がよいでしょう。おそらく ToList() メソッドを呼び出してから、GameViewModel オブジェクトを作成します。

于 2013-02-02T00:45:20.677 に答える