Здравствуйте, alex_public, Вы писали:
_>>>Хм, что-то не очень понятно (видимо потому что я с Linq не работаю), в особенности чем являются различных идентификаторы не из таблиц (которые не m. и f.). Или может вместо объяснения ты просто покажешь какой sql генерируется из этого запроса? )
IT>>Что-то вроде такого:
_>ОК, теперь понятно. Значит сравниваем:
_>_>from m in db.Messages
_>join f in db.AllowedForumsView(Account.ID) on m.ForumID equals f.ID
_>where
_> ids.Contains(m.ID) &&
_> m.BlogMessages.All(bm => bm.BlogID != BlogService.Cache.GetBlogID(db, id))
_>orderby
_> m.Subject
_>select
_> m.ID + ", " + m.Subject;
_>
_>и
_>_>auto m=DB::Messages{};
_>auto bm=DB::BlogMessages{};
_>auto f=AllowedForumsView(account_id);
_>auto q=select(m.ID, m.Subject)
_> .from(m.join(f).on(m.ForumID==f.ID))
_> .where(
_> m.ID.in(value_list(ids))&&
_> exists(select(all_of(bm)).from(bm).where(m.BlogID==bm.BlogID&&bm.BlogID!=id)))
_> .order_by(m.Subject.asc());
_>
_>На мой вкус для людей знакомых с SQL второй вариант понятнее. Хотя конечно синтаксис без скобок и точек выглядит проще и яснее, но только если бы он соответствовал SQL. А в первом варианте это совсем не так (мне вот даже понадобилась "консультация" для правильного понимания этого кода).
Теперь смотри фокус — в Linq ты работаешь в терминах совсем другой модели — объектной, например BlogMessages.All вернет тебе все что угодно.
Тебе же для этого 'что угодно' надо хардкодить конкретный вариант, как ты сделал через exist.
То есть, тебе надо протаскивать все намерения, детали в конкретую функцию и писать через if , что именно может быть унутре BlogMesages.All
Более того, твой SQL резко стал DB-специфик, а linq для другой базы сгенерирует другой запрос, возможно даже другой структуры. Конкретно в этом примере может и тоже самое будет, но в видео на 16й минуте можешь сам убедиться, как это происходит.