我在VB.NET中遇到了Linq的问题。 我从我的数据库创建了一个.dbml文件,一切看起来都很好 - 表之间的关系“箭头”是可见的等等。
但是当我想使用简单查询时(取自MS的101 Linq Samples):
Dim q = From h In dc.Hours, w In h.WorkType
我收到错误:
“INTegrity.WorkType”类型的表达式不可查询。确保您没有错过LINQ提供程序的程序集引用和/或名称空间导入。
h.Worktype在Intellisense中可见......
我可以手动加入Linq查询,但关系不应该是自动的吗?
有效的完整查询,但使用“手动连接”如下所示:
Dim q1 = From g In dc1.Hours _
Join pr In dc1.WorkType On g.WorkTypeId Equals pr.WorkTypeId _
Where g.WorkerId = workerid _
Select New With {g.EntryId, g.Date, pr.WorkTypeDesc, g.Minutes}
Worktype表与Hours表有1对多的关系(正如您在WorkTypeId列中看到的那样)
答案 0 :(得分:2)
我不会在VB中讲LINQ,所以我会尝试适应C#
From h In dc.Hours, w In h.WorkType
from h in dc.Hours
from w in h.WorkType
.....
这意味着WorkType是一个集合,它的名字并不暗示。我想你想要更接近的东西
from h in dc.Hours
let w = h.WorkType
....
当然,如果没有“......”中的部分,这些都不会做任何事情。如果你告诉我们你想在那里做什么,我们可能会为你解决它。
更新#1:
试着将你正在做的事情拼凑起来,让我们猜测那些时间& WorkType是具有一对多关系的表(“一”侧的WorkType),因此每小时记录匹配一个WorkType记录。在这种情况下,Linq-to-SQL将在几小时内自动生成标量 WorkType属性。您不需要“from ... in”来访问它。它只是一个属性,可以直接在您需要的地方使用它。
更新#2 :(来自评论) 我认为这应该有效:
Dim q1 =
From g In dc1.Hours
Where g.WorkerId = workerid
Select New With {g.EntryId, g.Date, g.WorkType.WorkTypeDesc, g.Minutes}