Re[101]: Тормознутость и кривость linq
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.05.16 14:19
Оценка:
Здравствуйте, 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й минуте можешь сам убедиться, как это происходит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.