Как использовать оператор?: В предложении 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 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 раньше ... вторая часть.
При создании анонимного типа (что вы делаете с «новым» без указания типа) вы должны указать имя члена для каждого свойства. В вашем примере это будет выглядеть примерно так: (также исправлены ваши объединения)
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}
Если вы видите мой пример, вы можете пропустить операторы соединения, используя вместо этого псевдонимы таблиц.
Без объединений вы только что реализовали декартово соединение (перекрестное произведение). Если бы в каждой таблице было 10 строк, вы бы получили 1000 результатов. Поверьте, вы ДЕЙСТВИТЕЛЬНО хотите, чтобы эти объединения присутствовали.
@GalacticCowboy, я совершенно уверен, что ты ошибаешься. Обратите внимание, что предложенный мной запрос должен использовать встроенные отношения FK для объединений. Я не использую db для каждой строки. Смотрите здесь: stackoverflow.com/questions/283103/linq-to-sql-foreign- ключи
@Jason, ты прав, я упустил тот факт, что ты использовал встроенные отношения. Если бы он их использовал (и не знал, почему не может ...), это сработало бы. Я ответил и в другой вашей ветке.
@tslib, это совсем другой вопрос. Вы, безусловно, должны обрабатывать отношения в своей БД, чтобы сохранить целостность отношений. Если вы этого не сделаете, вы столкнетесь с ситуациями, когда данные будут неправильно изменены из другого источника, тогда ваш RE испортится.
@ Джейсон, спасибо за ваш вклад; но это для моего личного блога и других источников у него нет.
Действительно. этот вопрос зависит от конкретной реализации IQueryable, которую вернет ваше выражение linq. Я вижу, что у вас есть db.XXX, так что вы используете linq для sql или какой-то linq для хранилища данных? В таком случае конкретная реализация IQueryable должна иметь способ переводить ваше выражение в выражение хранилища. Помимо приведенных выше комментариев, некоторые другие комментарии верны, что в анонимном типе вы должны указать имя для каждого члена. Это действительно твоя ошибка.
db в данном случае - это DataContext для моего класса Linq to SQL.
Я понимаю, в этом есть смысл. Есть ли у вас ответ, который вам нужен?
Ваша логика хороша для стандартных манипуляций со строками, но этот LINQ работает только наполовину так, как вы интуитивно ожидаете ... Та же ошибка.