具有多行的连接表的等效代码是什么?

时间:2015-10-14 02:21:16

标签: c# epicorerp

我有以下代码正常工作,但条件只有单行连接表。如何实现具有多行的连接表?

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

1 个答案:

答案 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”和“”等价物具有的案例和文化敏感性。