?: Оператор в запросе LINQ

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

  • Правильно ли это или достаточно, чтобы сказать "из внутреннего соединения я на внутреннем соединении 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 };
    

Ответ 1

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

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.

Ответ 2

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

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

Ответ 3

Я новичок в Linq для 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 должен находиться в круглых скобках и результаты вне их. Что касается объединений, вы следуете цепочке вниз от одного → много.

Ответ 4

Если вы проверяете только нулевое значение, вы также можете использовать

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

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

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

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

Ответ 5

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