在Linq Where子句中用字符串变量时VS2022解决方案无报错但构建失败
Visual Studio 2022添加LINQ语句后无提示构建失败问题
我使用Visual Studio 2022开发的解决方案原本可正常构建,添加以下LINQ语句后构建失败,但没有任何错误提示:
Dim playlistName as String = "blablabla" Dim objPlaylist = (From p In Playlists Where p.Name = playlistName Select p).FirstOrDefault()
项目细节
Playlists是类型为System.Collections.ICollection的属性,用于存储Playlist对象。即使将其类型改为System.Collections.Generic.ICollection(Of Playlist)或System.Collections.Generic.IEnumerable(Of Playlist),问题仍存在。- 当Where子句使用硬编码字符串(如
Where p.Name = "temp")时,构建正常且能查询到对应对象;无论使用Name还是Path属性,硬编码方式均有效,使用变量则触发构建失败。
已尝试的解决操作
- 清理解决方案并重建
- 重启Visual Studio
- 添加
System.Data.Linq程序集引用 - 导入
System.Linq命名空间(IDE提示无需导入) - 改用直接调用
FirstOrDefault的写法:
Dim playlistName As String = "blablabla" Dim oPlaylist = TestPlaylists.FirstOrDefault(Function(p) p.Name = playlistName)
以上操作均未解决问题,且相同代码在全新解决方案中可正常运行。
相关代码片段
Playlists属性定义
Private _playlists As System.Collections.ICollection Public Property Playlists() As System.Collections.ICollection Get Return _playlists End Get Set(ByVal value As System.Collections.ICollection) _playlists = value RaisePropertyChanged("Playlists") End Set End Property
Playlist类定义
<Serializable()> Public Class Playlist Inherits SSUtil.CustomObjects.WPF.NotificationObject Public Path As String ' 播放列表在磁盘上的路径(相对于前缀) Public Songs As New System.Collections.SortedList(New CaseInsensitiveComparer) ' 播放列表中的歌曲列表;仅为索引到主ColSongs的字符串列表 Public HasChanged As Boolean Public ReadOnly Property Name() As String Get ' 仅返回播放列表名称,例如Metal.m3u Return JustName(Path) End Get End Property ... 更多函数 End Class
最终解决方案
经过排查,问题根源在于项目中存在一个与playlistName同名的模块级变量,导致LINQ查询中的局部变量被隐式覆盖,编译器无法正确解析变量引用但未抛出明确错误。将局部变量重命名为targetPlaylistName后,构建成功通过。
内容的提问来源于stack exchange,提问作者Sandra
相关产品推荐
相关产品推荐

