什么是VB.NET中的正确LINQ JOIN语法?

时间:2016-02-09 16:05:08

标签: sql asp.net vb.net entity-framework linq

我在尝试加入SQL数据库视图和LINQ中的两个表时遇到问题。

我有一个表“GeneralParts”,其中包含:

  • PartGUID(uniqueidentifier)
  • SupersededBy(uniqueidentifier)
  • PartTypeID(int)

另一个表,“PartType”包含:

  • PartTypeID(int)
  • PartType(nvarchar)

一个视图,“ProductView”包含:

  • GUIDProduct(uniqueidentifier)
  • ProductID(nvarchar)
  • 描述(nvarchar)

我正在尝试在ASP.NET ListView控件的“GeneralParts”表中显示与ProductView中的GUIDProduct记录相关联的ProductID,以获取PartGUID和SupersededPartGUID。我使用以下代码来查询数据库:

 Dim products = From parts In myEntities.GeneralParts
                Join product In myEntities.ProductViews On parts.PartGUID Equals product.GUIDProduct
                Join productType In myEntities.PartTypes On parts.PartTypeID Equals productType.PartTypeID
                Join supersededPart In myEntities.ProductViews.DefaultIfEmpty() On parts.SupersededBy Equals supersession.GUIDProduct
                Select New With {.ProductID = product.ProductID, .Description = product.Description, .SupersededBy = supersession.ProductID, .PartType = productType.PartType}

问题是它只返回SupersededPartGUID字段不为空的记录并匹配ProductView中的记录。我相信这需要一个外部联接来返回记录,但我不确定VB.NET的正确语法。可以这样做吗?我是否错误地加入了“supersededPart”?

- 更新 -

我确实尝试了以下基于与此帖子链接“As Duplicate”的文章,但它没有解决我的问题:

Dim products = From parts In myEntities.GeneralParts
               Join product in myEntities.ProductViews On parts.PartGUID Equals product.GUIDProduct
               Join productType in myEntities.PartTypes On parts.PartTypeID Equals productType.PartTypeID
               From supersededParts In myEntities.ProductViews.DefaultIfEmpty()
               Where supersededParts.GUIDProduct = parts.SupersededBy
               Select New With {.ProductID = product.ProductID, .Description = product.Description, .PartType = productType.PartType,
                                .SupersededBy = If(parts.SupersededBy IsNot Nothing, supersededParts.ProductID, String.Empty)}

但是,这仍然只返回“SupersededBy”唯一标识符字段值不为NULL的记录。我在这里错误地使用了DefaultIfEmpty()方法吗?我在这里找不到正确的VB.NET语法,因为它似乎与其他地方可用的C#代码不匹配。

0 个答案:

没有答案