[英]Linq to EF guid in where clause always returns null
我尝试了许多不同的方法,LINQ语句中的“ topic”始终为null。 将GUID与SQLite作为数据源进行比较时,有什么特别的事情要做吗?
public TopicModel GetTopicModel(Guid id)
{
TopicModel topicModel = null;
using (var context = new onenessEntities())
{
var topic = context.Topics.FirstOrDefault(x => x.Id.Equals(id));
if (topic != null)
{
topicModel = new TopicModel
{
Id = topic.Id,
Description = topic.Description,
Title = topic.Title
};
}
}
return topicModel;
}
自动生成的SQL
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[CategoryId] AS [CategoryId],
[Extent1].[Language] AS [Language],
[Extent1].[Title] AS [Title],
[Extent1].[Description] AS [Description],
[Extent1].[Keywords] AS [Keywords],
[Extent1].[Version] AS [Version],
[Extent1].[CurrentPosition] AS [CurrentPosition],
[Extent1].[Notes] AS [Notes]
FROM [Topic] AS [Extent1]
WHERE ([Extent1].[Id] = @p__linq__0) AND (@p__linq__0 IS NOT NULL) LIMIT 1
-- p__linq__0: '90f8f2c6-31cf-47a1-b8fb-61d5f4130d8f' (Type = AnsiStringFixedLength)
-- Executing at 9/17/2015 2:56:37 PM -05:00
-- Completed in 1 ms with result: SQLiteDataReader
编辑 :我已经了解到此问题是由于SQLite将GUID存储为二进制Blob。 解决方法是,将数据类型从GUID更改为CHAR(36),现在可以使用LINQ到EF来检索记录。 我仍然想看看是否有人可以回答这个原始问题。
要解决此问题,请将其附加到连接字符串:
; binaryguid =假
如果为true-GUID列以二进制形式存储;否则为false。 否则,GUID列将存储为文本。 我认为,否则问题是由EF注入参数(类型= AnsiStringFixedLength)引起的。
当使用原始查询(带有执行读取器的SQLiteCommand)时,使用guid参数的查询仍可以与binaryguid一起正常工作。 避免使用EF,您可以自己提供。
command.Parameters.Add(new SQLiteParameter(DbType.Guid)
{
ParameterName = "@id",
Value = id
});
我将Id的数据类型更改为CHAR而不是GUID,以解决此问题。
我不知道正在为where子句x => x.Id.Equals(id)
生成什么SQL? 我发现此链接讨论了如果ID恰好是可为空的uniqueidentifier的表达式分析器中的错误。
建议的解决方法是以这种方式使用Equals: x => Object.Equals(x.Id, id)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.