小编MHo*_*lis的帖子

VB.Net中集合中对象的生命周期

我试图在下面的代码中找出tmpTabPages的生命周期.让我们假设表单有一个名为MyTabControl的空TabControl,它有一个名为NameCollection的字符串集合.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For Each itm In NameCollection
        Dim tmpTabPage as New TabPage(itm.toString)

        'Add Controls to tmpTabPage

        MyTabControl.TabPages.Add(tmpTabPage)
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)

由于tmpTabPage的范围是For/Next块,通常它的生命周期是直到块的结尾对吗?但是因为它被添加到具有块之外的范围的集合中它是否与集合具有相同的生命周期,或者在这种情况下是MyTabControl?最后,如果我调用MyTabControl.TabPages.Clear,集合中的tmpTabPages会被破坏还是只会坐在那里占用内存?

vb.net collections garbage-collection tabcontrol lifetime

2
推荐指数
1
解决办法
896
查看次数

实体框架选择带逻辑的语句

面对什么感觉是一个小挑战.我试图从两个不同的<Services>和<BlacklistedServices>模型中检索一个对象集合作为<ServicesViewModel>类型.

第一种:键入<Services>,将其命名为Services.(显示在第二个代码示例中)

第二种:键入<BlacklistedServices>,将其命名为BlacklistedServices.

Dim BlacklistedServices As IQueryable(Of Models.BlacklistedServices ) = unitOfWork.AutoServiceBlackList.GetAll()
Run Code Online (Sandbox Code Playgroud)

这两个集合之间的关系如下.列入黑名单的某些服务作为BlacklistedServices中的记录存在.

以下是我想要实现的目标:

  1. 创建所有服务的集合,并:
    1. 如果BlacklistedServices中存在服务记录,则将相应的属性"Blacklisted"设置为True.
    2. 如果BlacklistedServices中存在服务记录,则确定相应的黑名单服务记录的"强制"属性设置为什么,并将相应的属性"强制"设置为该值.

我已经完成了大部分工作.我被困在部分(1.2).

以下是我的工作代码:

    Services= uow.Services.GetAll().Select(Function(service) New ServiceViewModel() With
    {.ServiceID = service.ServiceID,
    .PropertyABC= service.ABC,
    .PropertyDEF= service.DEF.
    .Blacklisted = BlacklistedServices.Any(Function(BLS) BLS.ServiceName = service.Name),
    .Enforced = If(BlacklistedServices.Any(Function(BLS) BLS.ServiceName = service.Name),
          BlacklistedServices.FirstOrDefault(Function(BLS) BLS.ServiceName service.Name).Enforced, False)}).ToList()
Run Code Online (Sandbox Code Playgroud)

除了尝试在viewmodel上设置.Enforced属性时,它的工作方式非常完美.

.Enforced = If(BlacklistedServices.Any(Function(BLS) BLS.ServiceName = service.Name),
          BlacklistedServices.FirstOrDefault(Function(BLS) BLS.ServiceName service.Name).Enforced, False)}).ToList()
Run Code Online (Sandbox Code Playgroud)

返回的错误如下:

System.Data.EntityCommandCompliationException:{"准备命令定义时发生错误.有关详细信息,请参阅内部异常."} InnerException:{"无法将类型为'MySql.Data.Entity.SelectStatement'的对象强制转换为'MySql. Data.Entity.LiteralFragment"."}

问题似乎是在尝试使用逻辑时(If).在大多数情况下,我不认为这在构造新对象和确定作为参数传递的内容时会是一个问题; 但是,这或多或少被转换为必须发送到服务器的IQueryable表达式树.那么实体框架可能无法将逻辑转换为SQL逻辑?

一如既往,任何和所有的帮助表示赞赏!

linq vb.net entity-framework

1
推荐指数
1
解决办法
772
查看次数