我有以下代码正常工作,但条件只有单行连接表。如何实现具有多行的连接表?
class MyModelUpdateView(LoginRequiredMixin, UpdateView):
model = MyModel
form_class = MyModelUpdateForm
template_name = 'mymodel/update_mymodel.html'
def get_success_url(self):
view_name = 'update_mymodel'
return reverse_lazy(view_name, kwargs={'model_name_slug': self.kwargs.get('model_name_slug','')})
def get_form_kwargs(self):
'''
This injects form with keyword arguments.
'''
kwargs = super(MyModelUpdateView, self).get_form_kwargs()
#Update the kwargs with the user_id
kwargs['user'] = self.request.user
return kwargs
def get(self, request, *args, **kwargs):
# self.object = self.get_object()
if self.request.path != self.object.get_absolute_url():
return HttpResponseRedirect(self.object.get_absolute_url())
else:
return super(MyModelUpdateView, self).get(request,*args, **kwargs)
# context = self.get_context_data(object=self.object)
# return self.render_to_response(context)
def get_object(self, queryset=None):
instance = MyModel.objects.get(slug=self.kwargs.get('model_name_slug',''))
return instance
下面的代码工作正常,但我只是好奇,通过使用单行代码作为上面的例子可以实现更好吗?可能是使用foreach (var a in ttTableA.Where(r => r.RowMod == "U"))
{
var b = Db.TableB.FirstOrDefault(r => r.Company == callContextClient.CurrentCompany);
b.Field1 = a.Field1;
}
或其他内容来替换ToList()
?
FirstOrDefault
答案 0 :(得分:1)
您可以在第二个查询中添加.ToList(),如下所示:
foreach (var a in ttTableA.Where(r => r.RowMod == "U"))
{
foreach (var b in (
from row in Db.TableB.With(LockHint.UpdLock)
where row.Company == Session.CompanyID
select row).ToList())
{
b.Field1 = a.Field1;
}
}
这意味着Linq查询将在数据库中一次性返回SQL数据库中的所有记录(所有这些记录都被锁定)在IEnumerable而不是IQueryable中,这些记录将在每个循环中单独查询。
顺便提一下,在Epicor ERP中,您还应该编写以下内容而不是第一行:
foreach (var a in ttTableA.Where(r => r.Updated))
因为IceRow实现了更新,添加,删除和不变的属性,这些属性没有“U”,“A”,“D”和“”等价物具有的案例和文化敏感性。