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

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

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

  • Это правильный или достаточный способ сказать «из внутреннего соединения i на внутреннем соединении a.ipid = i.id в 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 };
    

Ответы [ 5 ]

18 голосов
/ 12 ноября 2008

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

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.

1 голос
/ 12 ноября 2008

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

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

0 голосов
/ 12 ноября 2008

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

0 голосов
/ 12 ноября 2008

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

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

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

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

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

0 голосов
/ 12 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...