如何在LINQPad中使用uniqueidentifier类型字段进行LINQ查询?
问题描述
SQL Server表MyTable的MyTableID列是uniqueidentifier类型,建表和插入数据的SQL语句如下:
CREATE TABLE [dbo].[MyTable] ( [MyTableID] [uniqueidentifier] NOT NULL, [SomeField] [int] NULL, CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED ([MyTableID] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO INSERT INTO MyTable (MyTableID, SomeField) VALUES ('A267715B-0CB0-4203-AB2F-002321DC521A', 1) INSERT INTO MyTable (MyTableID, SomeField) VALUES ('A267715B-0CB0-4203-AB2F-002321DC521B', 1)
在LINQPad 7中尝试用以下LINQ查询时出错:
MyTables.Where (m => m.MyTableID="A267715B-0CB0-4203-AB2F-002321DC521A")
错误提示:
Cannot implicitly convert type 'string to 'System.Guid'
修改为以下语句后仍报错:
MyTables.Where (m => m.MyTableID = Guid.Parse("A267715B-0CB0-4203-AB2F-002321DC521A"))
错误提示:
Cannot implicitly convert type 'System.Guid' to 'bool'
需要正确的LINQ查询写法。
解决方法
错误原因分析
- 第一个错误:
MyTableID是Guid类型,直接与字符串比较会触发类型不匹配,C#无法自动将字符串转为Guid。 - 第二个错误:
Where的lambda表达式中使用了赋值符号=,而非相等比较符号==,导致表达式返回Guid类型,而Where要求返回bool类型的判断结果。
正确写法
方法一:提前解析Guid(推荐)
先将字符串转为Guid变量,再在LINQ中使用,避免重复解析,且LINQ to SQL可正确转换为对应SQL查询:
var targetId = Guid.Parse("A267715B-0CB0-4203-AB2F-002321DC521A"); MyTables.Where(m => m.MyTableID == targetId)
方法二:表达式内直接比较
如果要在lambda表达式内直接解析,必须使用相等比较符号==:
MyTables.Where(m => m.MyTableID == Guid.Parse("A267715B-0CB0-4203-AB2F-002321DC521A"))
可选:安全解析(避免无效字符串异常)
若不确定输入字符串格式是否合法,可使用Guid.TryParse做安全处理:
if(Guid.TryParse("A267715B-0CB0-4203-AB2F-002321DC521A", out var targetId)) { var result = MyTables.Where(m => m.MyTableID == targetId); // 处理查询结果 }
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

