【发布时间】:2015-09-30 21:45:46
【问题描述】:
我正在努力完善我对 Linq 的了解和使用。我有一个从标准 sql 数据库构建的实体框架模型。
在标准 sql 中,我可以执行以下查询:
DECLARE
@VesselId int = 1
SELECT COALESCE(c.CompanyName,c.FirstName + ' ' + c.LastName) FROM dbo.Contacts c
WHERE c.ContactId = (SELECT v.OwnerId FROM dbo.Vessels v WHERE v.VesselId = @VesselId)
根据 ssms 执行需要 0.00.00.029 秒。
现在我尝试将其转换为 linq 以在我的模型中运行,并且到目前为止已经提出了这个(我一直在 Linqpad 中测试(因此是转储语句)):
Sub Main
Dim name As String = GetOwnersName(1)
name.Dump
End Sub
Private Function GetOwnersName(ByVal id As Integer) As String
Dim myContact As Contact
Dim query = From c In Contacts
Where c.ContactId = (From v In Vessels
Where v.VesselId = id
Select v.OwnerId
).FirstOrDefault
Select c
myContact = query.FirstOrDefault
Return If(myContact.CompanyName, myContact.FirstName + " " + myContact.LastName)
End Function
这在 0.00.00.065 秒内执行。我知道第一个 sql 查询是直接在 sql server 上执行的,但我怀疑 linq 可以被优化以提高效率。我希望通过使用在两种环境中我都能清楚理解的东西(我承认对 sql 更满意),我可以改进我的 linq。服务器上的联系人表有大约 40 多个字段,我确信在 linq 示例中返回所有这些字段并不能提高速度。
任何人都可以建议如何改进 linq,是否可以解释为什么可以这样,以便我可以从中学习。
谢谢
编辑 linq 的最新版本。可以改进吗?
Sub Main
Dim name As String = GetOwnersName(4)
name.Dump
End Sub
Private Function GetOwnersName(ByVal id As Integer) As String
Dim query = From c In Contacts
Where c.ContactId = (From v In Vessels
Where v.VesselId = id
Select v.OwnerId
).FirstOrDefault
Select (If( c.CompanyName, c.FirstName + " " + c.LastName))
Return query.FirstOrDefault
End Function
【问题讨论】: