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();
        }

在运行程序时,我从第二个数据库查询(dbContext.Leaderboard.Where...)中得到以下错误:

LINQ to Entities 无法识别方法 'QrCodeTreasureHunter.Models.TreasureHuntDetails get_Item(Int32)' 方法,并且此方法无法转换为存储表达式。

在第一个查询中,我得到了与特定用户关联的每个寻宝活动。

在第二部分中,我尝试遍历每个寻宝活动,并使用我的排行榜表中的相关排行榜条目填充寻宝活动的排行榜列表属性。

根据我从阅读中了解到的情况,使用 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 回答