Nano Hash - криптовалюты, майнинг, программирование

LINQ to Entities не распознает метод get_Item(Int32)

(Пожалуйста, прочитайте, прежде чем помечать как дубликат, поскольку мой конкретный сценарий уникален)

У меня есть следующий код:

        // 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 -как);

29.03.2013
  • Это точно. На самом деле я подозревал, что это как-то связано с индексатором, и вчера попытался выполнить цикл foreach, но, к своему стыду, я все испортил (ночное кодирование...). Ваше здоровье! 29.03.2013
  • @CiaranG: Да, извините, это была опечатка, я уже исправил ее (не хочу, чтобы мой ошибочный ответ плавал вокруг). Я рад, что это помогло вам ;) 29.03.2013

  • 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);
        }
    
    03.04.2013
  • Итак, это сработало для вас, просто присвоив значение индекса переменной и используя его в запросе? 04.04.2013
  • Ага. Это работает: 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 ‹= TreasureHunts.Count; i++) { TreasureHunts[i].Leaderboard = dbContext.Leaderboard.Where( Leaderboard =› Leaderboard.TreasureHuntId == TreasureHunts[i]. TreasureHuntId).ToList); } 04.04.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..