1

(私の特定のシナリオはユニークであるため、重複としてマークする前に読んでください)

次のコードがあります。

        // Get each treasure hunt
        var treasureHunts = dbContext.TreasureHunts.Where(i => i.UserName == User.Identity.Name).ToList();

        // Populate each treasure hunt with the list of leaderboard entries
        for (int i = 0; i <= treasureHunts.Count; i++)
        {
            treasureHunts[i].Leaderboard = dbContext.Leaderboard.Where(
                leaderboard => leaderboard.TreasureHuntId == treasureHunts[i].TreasureHuntId).ToList();
        }

プログラムを実行すると、2 番目のデータベース クエリ (dbContext.Leaderboard.Where...) から次のエラーが表示されます。

LINQ to Entities はメソッド 'QrCodeTreasureHunter.Models.TreasureHuntDetails get_Item(Int32)' メソッドを認識せず、このメソッドはストア式に変換できません。

最初のクエリでは、特定のユーザーに関連付けられた宝探しをそれぞれ取得しています。

2 番目の部分では、各トレジャー ハントを反復処理し、トレジャー ハントの Leaderboard List プロパティに、Leaderboard テーブルからの関連付けられたリーダーボード エントリを入力しようとしています。

私が読んで理解していることから、このクエリは Entity Framework の現在の形式では不可能であるということです。

この問題を解決するために、どのような回避策または解決策をお勧めできますか? 理想的なソリューションは、データ モデルを変更しないことです。

関連する場合、TreasureHunt モデルは次のとおりです。

    public class TreasureHuntDetails
{
    public TreasureHuntDetails()
    {
        Clues = new List<Clue>();
        Leaderboard = new List<Leaderboard>();

        var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
        var dcs = new DataContractSerializer(typeof (TreasureHuntDetails), null, int.MaxValue,
                                             false, true, null);
        xml.SetSerializer<TreasureHuntDetails>(dcs);
    }

    [Key]
    public int TreasureHuntId { get; set; }
    [Required]
    public virtual string UserName { get; set; }
    [Required]
    public String Name { get; set; }
    public String Description { get; set; }
    [Required]
    public String Password { get; set; }
    public String CompletionMessage { get; set; }
    public String State { get; set; }
    public List<Clue> Clues { get; set; }
    public List<Leaderboard> Leaderboard { get; set; } 
}

リーダーボード モデルは次のとおりです。

    public class Leaderboard
{
    [Key]
    public int Id { get; set; }
    public int TreasureHuntId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Completion { get; set; }

    public DateTime? StartTime { get; set; }
    public DateTime? EndTime { get; set; }
    public Int64 TimeTaken { get; set; }

    public TreasureHuntDetails TreasureHuntDetails { get; set; }
}

幸運を!

4

2 に答える 2

5

今はテストできませんが、インデクサーである可能性があります。これを試してください:

foreach (var treauserHunt in treasureHunts)
{
    treasureHunt.Leaderboard = dbContext.Leaderboard.Where(leaderboard => 
        leaderboard.TreasureHuntId == treasureHunt.TreasureHuntId).ToList();
}

これが問題かどうかはわかりませんが、LINQ クエリの配列のインデックス作成で問題が発生したことを覚えています。それが LINQ メソッドの構文 (使用している構文) にあったのか、他の構文 (SQL -お気に入り);

于 2013-03-29T04:14:16.627 に答える
3

答えてくれてありがとう。それは私の問題を解決しました。私はまだforループを使いたかったので、次のようにしました:

for (int i = 0; i <= treasureHunts.Count; i++)
    {
        var thisTreasureHunt = treasureHunts[i];

        treasureHunts[i].Leaderboard = dbContext.Leaderboard.Where(
            leaderboard => leaderboard.TreasureHuntId == thisTreasureHunt.TreasureHuntId).ToList);
    }
于 2013-04-03T21:47:27.817 に答える