LINQ to Entities 无法识别方法 ... get_Item(Int32)

Posted

技术标签:

【中文标题】LINQ to Entities 无法识别方法 ... get_Item(Int32)【英文标题】:LINQ to Entities does not recognize the method ... 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; 

祝你好运!

【问题讨论】:

【参考方案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);

以上是关于LINQ to Entities 无法识别方法 ... get_Item(Int32)的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities 无法识别方法 IsNullOrWhiteSpace

错误:LINQ to Entities 无法识别方法 DataLength

LINQ To Entities 无法识别方法 Last。真的吗?

LINQ To Entities 无法识别方法 Last。真的吗?

C# LINQ to Entities 无法识别方法“布尔”

我如何修复“LINQ to Entities无法识别方法”错误