-
Как использовать оператор?: в предложении 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 };
?: Оператор в запросе LINQ
Ответ 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 должен быть способ перевести ваше выражение в выражение хранилища. Помимо приведенных выше комментариев, некоторые из других комментариев верны, что в анонимном типе вы должны указать имя для каждого члена. Это действительно ваша ошибка.