【问题标题】:LINQ to Entities does not recognize the method ... get_Item(Int32)LINQ to Entities 无法识别方法 ... get_Item(Int32)
【发布时间】:2013-03-29 01:09:40
【问题描述】:

(请在标记为重复之前阅读,因为我的特定场景是独一无二的)

我有以下代码:

        // 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; }
}

祝你好运!

【问题讨论】:

    标签: entity-framework entity-framework-4


    【解决方案1】:

    我现在无法测试它,但它可能是索引器,试试这个:

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

    我不确定这是不是问题,但我记得在 LINQ 查询中的数组索引存在一些问题,只是不记得是使用 LINQ 方法语法(您正在使用的那个)还是另一个(类似 SQL);

    【讨论】:

    • 就是这样。我实际上怀疑这与索引器有关,并在昨天尝试了一个 foreach 循环,但令人尴尬的是我把它搞砸了(深夜编码......)。干杯!
    • @CiaranG:是的,抱歉,这是一个错字,我已经修复了它(不希望我的错误答案四处飘荡)。我很高兴它对你有所帮助;)
    【解决方案2】:

    感谢您的回答;它解决了我的问题。我仍然想使用 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);
        }
    

    【讨论】:

    • 所以这对你有用,只需将索引值分配给一个变量并在查询中使用它?
    • 是的。这有效: for (int i = 0; i leaderboard.TreasureHuntId == thisTreasureHunt.TreasureHuntId).ToList); } 但这不是: for (int i = 0; i leaderboard.TreasureHuntId == TreasureHunts[i]. TreasureHuntId).ToList); }
    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多