Комментарии 22
НЛО прилетело и опубликовало эту надпись здесь
Фиг с ним)
Когда делишься информацией, не важно, сколько минусов тебе поставят. Важно, что она кому-нибудь поможет
Хочу дополнить к пункту 6.Мониторить запросы, которые генерирует LINQ.
Это очень актуально для запросов с join-ами. Заметил, что если использовать более 1-го join-а и оператор into, в 80% случаев linq генерит неоптимальный код.

Еще есть удобный и бесплатный инструмет для работы с linq запросами — linqpad (скачать можно здесь www.linqpad.net)
У меня есть вопрос по 5 пункту:
как сделать UpdateCheck.Never для всех сущностей по умолчанию?
Я удобного способа не нашел.
Да и на форуме MSDN пока ничего не ответили.

Думаю, можно DBML-файл открыть в XML-редакторе и просто сделать replace.
В общем я для себя вопрос апдейта решил следующим образом.
псевдокод:

public void Update(Entity entity)
{
using(MyDataContext dc = DataContextFactory.CreateInstance())
{
Entity original = dc.Entities.SingleOrDefault(c => c.Id == entity.Id);
ItemHelper.Clone(entity, original);
dc.SubmitChanges();
}
}

Фишка тут в методе Clone. Он с помощью рефлексии проходтся по всем полям первого объекта, помеченым атрибутом Column и копирует их значени во второй объект.
Для простых апдейтов работает замечательно
Клонирование не совсем эффективная техника.
Рефлекция.
Я бы советовал просто добавить в каждую таблицу добавить по колонке типа timestamp (MSSQL) и вам не придется с клонированием мучаться.
К сожалению это не всегда возможно.
К тому же клонирование для ссылочных типов как раз рекомендуется, дабы случайно не изменить объект
AlexS, привет
времени с публикации поста прошло немало, но надеюсь Вы эту тему еще не забросили, и сможете помочь в одном вопросе :)

Если сформулировать вкратце, то как сделать ObjectTrackingEnabled=false и SubmitChanges одновременно?
Т.е. если я извлекаю какие-то данные конструкцией select c, затем в другом приложении меняю эти данные, и читаю в исходном снова — они не меняются, LINQ соханяет их в текущий кэш.
Refresh объекта делать не всегда возможно (например, я удалил запись). Создавать каждый раз новый контекст — забить память (dispose не приводит к немедленному освобождению памяти).

А как Вы строите многопользовательские приложения?
Вам как раз Refresh и нужен.
LINQ To SQL exception with Attach(): Cannot add an entity with a key that is alredy in use

Насчет удаленных сущностей, их, подозреваю, нужно обрабатывать отдельно.

>А как Вы строите многопользовательские приложения?
Давно уже linq2sql не используем, да и занимаюсь теперь другими вещами. Поэтому ответить нечего.

Если у вас есть конкретный пример и вопрос, залейте его на StackOverflow, а я могу переслать ссылку на вопрос ребятам, которые помогут.
9. Take и только потом Skip? А не наоборот ли?

(Знаю, статья жутко устарела. Но все же.)

return context.Products
.Take(pageSize)
.Skip(startingPageIndex * pageSize)
.ToList();
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.