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

Сравнение Entity Framework 5 Guid приводит к тому, что SQL не выполняется

У меня есть база данных, в которой ключи большинства таблиц принадлежат Guid. Проблема в том, что если я попытаюсь выполнить оператор LINQ to Entity и сравню Guid, который у меня есть, с Guid, который существует в одной из Entities, на которые я ссылаюсь, SQL никогда не запустится! Я тестировал это, используя SQL Server 2008 R2 с запущенным SQL Profiler, и при выполнении инструкции sql явно никогда не попадал в базу данных. Если я беру сравнение Guid, то sql передается на SQL Server, и я получаю результат обратно.

Например:

var itemType = new Guid("27733204-C1E6-4F93-BEAD-63C2C8EBC299");
var items from myDBContext.Items.Where(x => x.itemType == itemType);

Я пробовал другие методы, такие как x.itemType.CompareTo(itemType), но ничего не работает. По сути, если у меня есть Guid, который я хотел бы использовать в любом типе предложения Where, которое выходит за рамки самого оператора linq, я не получаю абсолютно никакого SQL, выдаваемого серверу.

Я надеюсь, что у кого-то есть ответы. В настоящее время используется Entity Framework 5 с С# 4.5.


  • Какая версия .NET? 28.08.2013
  • Вы используете одинарные кавычки там, где вы должны использовать двойные кавычки. Поэтому у меня такое чувство, что вы не публикуете свой фактический код. То, что у вас есть здесь, не будет компилироваться. 28.08.2013
  • из предоставленного кода вы не оцениваете выражение linq: myDBContext.Items.Where(x => x.itemType == itemType). Если это проблема, попробуйте myDBContext.Items.Where(x => x.itemType == itemType).ToArray(); 28.08.2013
  • @JefferyKhan Вы правы - я делал псевдокод, так как не могу опубликовать оригинал. Я обновил цитаты, чтобы они были правильными. 28.08.2013
  • Что касается ответа, который я выбрал, следует отметить, что единственное изменение, которое я внес в свой код, заключалось в удалении сравнения Guid - очевидно, при этом код делает нетерпеливое получение, тогда как наличие Guids вызывает ленивое получение. Не совсем уверен, почему это так, но либо выполнение foreach, как упомянул Брайан, либо выполнение .ToList() в конце оператора запроса помогло. 28.08.2013

Ответы:


1
 If I take out the Guid comparison, then the sql is passed to SQL Server and I get a result back.

Судя по описанию, любой код, который вы изменили, вызвал немедленное выполнение запроса. Методы LINQ поддерживают отложенное выполнение. Отложенное выполнение в основном означает, что запрос не будет выполняться до тех пор, пока не потребуются результаты. Обычно методы, возвращающие последовательность, используют отложенное выполнение.

Where() — один из таких методов, который использует отложенное выполнение. Single()/SingleOrDefault() выполнить немедленно. Другими словами, последние типы методов выполняются немедленно и, следовательно, вызовут видимость SQL-трафика в профилировщике даже без повторения результатов.

            IEnumerable<Catalog> result;
            Catalog result2;
            using (var context = new ExampleEntities())
            {
                var itemType = new Guid("E8110BDE-8433-4C49-BA9A-034DEA2FA20E");
                result = context.Items.Where(x => x.ItemID == itemType);//deferred
                result2 = context.Items.First();//immediate

                //The foreach code below causes the deferred query to execute.
                if (result != null)
                {
                    foreach (var catalog in result)
                    {
                        Console.WriteLine("{0}, {1}", catalog.ItemID, catalog.ModifiedDate);
                    }
                }
            }     
27.08.2013
  • Если я вызову для этого ToList(), это также должно привести к выполнению, поэтому я попробую - я даже не подумал об отложенном. Я вернусь с обновлением. 28.08.2013
  • На самом деле, Брайан, это самое интересное. Обратите внимание на свой результат != null - вот где была моя главная проблема. Результат всегда нулевой, поэтому foreach никогда не запускается. 28.08.2013

  • 2

    Попробуйте следующее

    // Create a sample item
    var itemType = new Guid("27733204-C1E6-4F93-BEAD-63C2C8EBC299"); 
    
    // Create a holder for the value of ItemType.
    // EF will not be able to translate itemType.ToString()
    // to SQL if you try to call it directly.
    var itemTypeValue = itemType.ToString();
    
    // Execute your query 
    // I placed ToList() to force the
    // execution.  You can use anything
    // that will cause the query to enumerate.
    var items from myDBContext.Items.Where(x => x.itemType == itemTypeValue).ToList(); 
    
    27.08.2013
  • Это не скомпилируется - нельзя сделать == из String в Guid. 28.08.2013
  • Новые материалы

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

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

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

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

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

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

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