я должен обновить несколько записей в EF и я придумал со следующими двумя способами:Force Entity Framework для обновления нескольких записей в одном раунде.
Метод 1: ExecuteSqlCommand
(прямой SQL)
customDB.Database.ExecuteSqlCommand(
@"UPDATE dbo.UserInfo
SET dbo.UserInfo.Email = dbo.IAMUser.Email,
dbo.UserInfo.Mobile = dbo.IAMUser.Phone
FROM dbo.UserInfo
INNER JOIN dbo.IAMUserMapping ON dbo.UserInfo.UserID = dbo.IAMUserMapping.fUserId
INNER JOIN dbo.IAMUser ON IAMUser.IAMID = IAMUserMapping.fIAMID
WHERE dbo.IAMUser.IAMID = @iamid ", new SqlParameter("@iamid", SqlDbType.UniqueIdentifier) { Value = IAMID });
Метод 2: Linq Еогеасп:
var ui = from userInfo in customDB.UserInfo
join userMapping in customDB.IAMUserMapping
on userInfo.UserID equals userMapping.fUserId
join iamUser in customDB.IAMUser
on userMapping.IAMUser.IAMID equals iamUser.IAMID
where iamUser.IAMID == IAMID
select new
{
userInfo.UserID,
iamUser.Email,
iamUser.Phone
};
foreach (var x1 in ui)
{
var u = new UserInfo
{
UserID = x1.UserID,
Email = x1.Email,
Mobile = x1.Phone
};
customDB.UserInfo.Attach(u);
var entry = customDB.Entry(u);
entry.Property(e => e.Email).IsModified = true;
entry.Property(e => e.Mobile).IsModified = true;
}
customDB.SaveChanges();
Метод № 1 является наиболее эффективным, в результате чего возникает один запрос SQL.
Метод №2 так же эффективен на стороне SQL Server, но он генерирует намного больше круговых поездок на сервер. 1 выберите, чтобы получить записи, затем 1 обновление для каждой обновленной записи.
Метод №2 даст ошибку времени компиляции, если что-либо в БД будет изменено, а # 1 даст ошибку времени выполнения.
Что люди считают лучшей практикой в таких случаях?
Есть ли способ получить лучшее из обоих миров?
Существует известная ошибка в разметке SO, которая вызывает проблемы с форматированием кода в нумерованных списках. Я просто отказался от редактирования, что сделало его еще хуже, поэтому я не могу сейчас это исправить. Просто [править] и избавиться от нумерованного списка и правильно отформатировать код в качестве кода. – Will
Я видел это на столбе, исправил его, написав метод спереди. Ty для редактирования. – devzero
* Лучшая практика * делает этот вопрос вне темы в Stack Overflow (основанный на мнениях, и трудно ответить, потому что вам решать взвешивать компромиссы обоих методов). * любой другой способ оптимизировать этот запрос? * Здесь лучше задать вопрос, но даже тогда можно утверждать, что CodeReview лучше подходит. –