?: Оператор в LINQ Query

  • Как использовать оператор?: В предложении SELECT запроса LINQ? Если это невозможно, как я могу подражать одному? Цель состоит в том, чтобы получить блок CASE в моем предложении select. Как вы могли догадаться, я получаю сообщение об ошибке: Недопустимый декларатор члена анонимного типа. Члены анонимного типа должны быть объявлены с назначением члена, простым именем или доступом к члену.

  • Это правильный или достаточный способ сказать «из внутреннего соединения i на a.ipid = i.id внутреннее соединение u на i.uid = u.id»? Если нет, укажите его. Спасибо.

    var query =
        from a in db.tblActivities
        from i in db.tblIPs
        from u in db.tblUsers 
        select new {
            u.UserName == null
                ? i.Address
                : u.UserName,
            a.Request,
            a.DateTime };
    
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
12 095
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я новичок в Linq to SQL, но уверен, что все будет так:

var query =
    from a in db.tblActivities
    from i in a.tblIPs
    from u in i.tblUsers 
    select new
    {
        userName = (u.UserName == null)
            ? i.Address
            : u.UserName,
        a.Request,
        a.DateTime
    };

Оператор if должен быть в круглых скобках, а результаты - вне их. Что касается объединений, вы следуете по цепочке от одного до многих.

Вы должны использовать ключевое слово join и определить отношения между объектами, чтобы сделать правильное внутреннее соединение.

Здесь, вы можете найти несколько примеров по этому поводу, я также настоятельно рекомендую вам получить LinqPad, это действительно ценный инструмент для тестирования ваших запросов, также его очень хорошо изучать, у него более 200 примеров.

если вы проверяете только null, вы также можете использовать ??

string something = null;
string somethingElse = something ?? "default value";

Что касается приведенных выше примеров, то правильно делать те, которые идут ...

string something = (somethingElse == null ? "If it is true" : "if it is false");

Паренсы не требуются, но они помогают при чтении.

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

tsilb 12.11.2008 05:49

странно ... Я использовал это в запросах LINQ раньше ... вторая часть.

hugoware 12.11.2008 07:31
Ответ принят как подходящий

При создании анонимного типа (что вы делаете с «новым» без указания типа) вы должны указать имя члена для каждого свойства. В вашем примере это будет выглядеть примерно так: (также исправлены ваши объединения)

var query = from a in db.tblActivities
            join i in db.tblIPs on a.ipid equals i.id
            join u in db.tblUsers on i.uid equals u.id
            select new {
               UserName = (u.UserName ?? i.Address),
               Request = a.Request,
               Date = a.DateTime
            };

Вы, вероятно, тоже могли бы использовать UserName по-своему:

UserName = (u.UserName == null) ? i.Address : u.UserName,

но ?? оператор более лаконичен. Это похоже на «isnull» в SQL.

Потрясающий. Это было очень близко и привело меня к ответу: от a в TblActivities присоединиться к i в TblIP на a.IPID равно i.ID присоединиться к u в TblUsers на a.UID равно u.ID выбрать новый {UserName = (u.UserName? ? i.Address), Request = a.Request, Date = a.DateTime}

tsilb 12.11.2008 06:07

Если вы видите мой пример, вы можете пропустить операторы соединения, используя вместо этого псевдонимы таблиц.

LeppyR64 12.11.2008 06:32

Без объединений вы только что реализовали декартово соединение (перекрестное произведение). Если бы в каждой таблице было 10 строк, вы бы получили 1000 результатов. Поверьте, вы ДЕЙСТВИТЕЛЬНО хотите, чтобы эти объединения присутствовали.

GalacticCowboy 12.11.2008 07:38

@GalacticCowboy, я совершенно уверен, что ты ошибаешься. Обратите внимание, что предложенный мной запрос должен использовать встроенные отношения FK для объединений. Я не использую db для каждой строки. Смотрите здесь: stackoverflow.com/questions/283103/linq-to-sql-foreign-‌ ключи

LeppyR64 12.11.2008 08:14

@Jason, ты прав, я упустил тот факт, что ты использовал встроенные отношения. Если бы он их использовал (и не знал, почему не может ...), это сработало бы. Я ответил и в другой вашей ветке.

GalacticCowboy 12.11.2008 15:05

@tslib, это совсем другой вопрос. Вы, безусловно, должны обрабатывать отношения в своей БД, чтобы сохранить целостность отношений. Если вы этого не сделаете, вы столкнетесь с ситуациями, когда данные будут неправильно изменены из другого источника, тогда ваш RE испортится.

LeppyR64 12.11.2008 16:37

@ Джейсон, спасибо за ваш вклад; но это для моего личного блога и других источников у него нет.

tsilb 13.11.2008 05:27

Действительно. этот вопрос зависит от конкретной реализации IQueryable, которую вернет ваше выражение linq. Я вижу, что у вас есть db.XXX, так что вы используете linq для sql или какой-то linq для хранилища данных? В таком случае конкретная реализация IQueryable должна иметь способ переводить ваше выражение в выражение хранилища. Помимо приведенных выше комментариев, некоторые другие комментарии верны, что в анонимном типе вы должны указать имя для каждого члена. Это действительно твоя ошибка.

db в данном случае - это DataContext для моего класса Linq to SQL.

tsilb 12.11.2008 06:43

Я понимаю, в этом есть смысл. Есть ли у вас ответ, который вам нужен?

user36784 12.11.2008 18:31

Другие вопросы по теме