Как использовать оператор ?: в предложении 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 };
?: Оператор в запросе LINQ
Ответы (5)
При создании анонимного типа (что вы делаете с «новым» без указания типа) вы должны указать имя члена для каждого свойства. В вашем примере это будет выглядеть примерно так: (также исправлено ваше соединение)
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 = (u.UserName == null) ? i.Address : u.UserName,
но ?? оператор является более кратким. Это похоже на «isnull» в SQL.
Вы должны использовать ключевое слово соединения и определить отношения между объектами, чтобы сделать правильное внутреннее соединение.
Здесь вы можете найти несколько примеров, я также настоятельно рекомендую вам чтобы получить LinqPad, это действительно ценный инструмент для тестирования ваших запросов, а также очень полезный для изучения, он имеет 200+ примеров.
если вы проверяете только значение null, вы также можете использовать ??
string something = null;
string somethingElse = something ?? "default value";
Что касается примеров выше, то правильно делать те, которые идут...
string something = (somethingElse == null ? "If it is true" : "if it is false");
Скобки не требуются, но они помогают в чтении.
Действительно. этот вопрос зависит от конкретной реализации IQueryable, которую вернет ваше выражение linq. Я вижу, что у вас есть db.XXX, поэтому вы используете linq to sql или какой-то linq для хранилища данных? Если это так, конкретная реализация IQueryable должна иметь способ перевести ваше выражение в выражение хранилища. Помимо приведенных выше комментариев, некоторые другие комментарии верны тому, что в анонимном типе вы должны указать имя для каждого члена. Это действительно ваша ошибка.
Я новичок в 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 должен быть заключен в круглые скобки, а результат — за их пределами. Что касается соединений, вы следуете по цепочке от одного до многих.