Arhn - архитектура программирования

Как написать запрос SQL SELECT INNER JOIN с несколькими условиями (с LIKE) для LINQ to SQL

Я искал, как это сделать, и я нашел что-то близкое, но не совсем то, что я ищу. Интересно, может ли это помочь и другим, но мне действительно не помешала бы помощь. У меня есть довольно простой оператор SELECT, который мне нужно преобразовать в LINQ to SQL, чтобы ускорить поиск в нашем программном обеспечении:

SELECT  Animals.*
FROM    Animals 
        INNER JOIN AnimalAliases
        ON  Animals.AnimalID = AnimalAliases.AnimalID 
        AND AnimalAliases.Alias LIKE N'%USERINPUT%';

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

var query = 
    from animal in context.Animals
    join animalAlias in context.AnimalAliases
        on new { animal.AnimalID, "USERINPUT" }
    equals new { animalAlias.AnimalID, animalAlias.Alias }
    select animal;

но это явно не работает, потому что я не хочу EQUALS для USERINPUT, я хочу выполнять над ним различные операции LIKE..

У кого-нибудь есть понимание?

30.05.2011

Ответы:


1

Я думаю, что вы ищете просто обычное предложение WHERE?

var query = from animal in context.Animals
   join animalAlias in context.AnimalAliases on animal.AnimalID equals animalAlias.AnimalID
   where animalAlias.Alias.Contains(USERINPUT)
   select animal;

Текст псевдонима не является частью отношения внешнего ключа, поэтому его не должно быть в объединении.


Обновление — после комментариев — в том числе от @Steven — хотя приведенный выше запрос верен и действительно имитирует исходный SQL — может быть целесообразно использовать Distinct() на выходе — это предотвратит случай совпадения нескольких псевдонимов может иметь место для одного животного.

var query = (from animal in context.Animals
   join animalAlias in context.AnimalAliases on animal.AnimalID equals animalAlias.AnimalID
   where animalAlias.Alias.Contains(USERINPUT)
   select animal).Distinct();
30.05.2011
  • Ах, я только что написал это тоже. Спасибо за помощь, это увеличило скорость поиска псевдонимов животных на сотни процентов, я уверен, в больших базах данных. Раньше то, как я это делал, было ужасно и постоянно включало всех животных. 30.05.2011
  • Обратите внимание, что ваш запрос может возвращать дубликаты. Вы должны вызвать .Distinct(), чтобы получить уникальные значения. 30.05.2011
  • @Steven - Хороший вопрос - хотя на самом деле это то же самое, что и исходный SQL. 30.05.2011
  • Вау... в этом ты абсолютно прав. Я не думаю, что это фактическое поведение, которого ожидает ОП, но, тем не менее, очень резкое. +1 за это! 30.05.2011

  • 2

    Это поможет:

    IQueryable<Animal> query = 
        from animal in context.Animals
        where animal.AnimalAliases
            .Any(a => a.Alias.Contains("USERINPUT"))
        select animal;
    

    Кроме того, вы можете сделать это наоборот (начать с объекта AnimalAlias вместо объекта Animal):

    IQueryable<Animal> query = (
        from animalAlias in context.AnimalAliases
        where animalAlias.Alias.Contains("USERINPUT")
        select animalAlias.Animal)
        .Distinct();
    
    30.05.2011
  • Но он должен возвращать набор IQueryable‹Animal›, поэтому я думаю, что ответом является первый. На самом деле я понял это по-другому, не уверен, поможет ли это кому-нибудь или действительно ли это вообще, я не проверял точность: 30.05.2011
  • Запрос IQueryable‹Animal› = из a в поиске. Животные присоединяются к al в поиске. 30.05.2011
  • Пожалуйста, прекратите использовать joins в linq. Они скрывают ваш код и в большинстве ситуаций не нужны, потому что O/RM уже знает об отношениях. 30.05.2011
  • @Philippe: Ваш запрос не возвращает список уникальных Animal объектов. Он может вернуть дубликат Animals. Кстати. Оба моих запроса возвращают IQueryable<Animal>. Они функционально эквивалентны. 30.05.2011
  • @Steven - я считаю хорошей практикой использовать join в Linq - я согласен, что для Linq2Sql созданный SQL, вероятно, будет иметь такую ​​же производительность, но когда вы перейдете на Linq2Objects или другие ORM, вы можете увидеть улучшение производительности (см. Ответ JS в stackoverflow.com/questions/3014123 /) - также, что касается того, делает ли join код более неясным или нет, я думаю, это зависит от личного мнения (и люди всегда будут не соглашаться с некоторыми вещами!) 30.05.2011
  • @Stuart: За последние несколько лет я неплохо научился оптимизировать запросы LINQ для повышения производительности, если можно так сказать. Однако есть одно правило, которого я всегда придерживаюсь: я оптимизирую только тогда, когда есть проблема. Во всех остальных случаях я пишу максимально читаемый код. Использование join кажется мне преждевременной оптимизацией. Если вы используете O/RM, который дает сбои, это не очень хороший O/RM. Мне трудно представить, что есть кто-то, кто находит join более читабельным, чем "точечный" подход, но вы правы, о вкусах спорить трудно. 30.05.2011
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..