Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# where子句中的Linq到EF guid始终返回null_C#_Entity Framework_Linq_Sqlite - Fatal编程技术网

C# where子句中的Linq到EF guid始终返回null

C# where子句中的Linq到EF guid始终返回null,c#,entity-framework,linq,sqlite,C#,Entity Framework,Linq,Sqlite,我尝试了许多不同的方法,并且LINQ语句中的“topic”总是空的。在将guid与SQLite作为数据源进行比较时,是否需要做一些特殊的事情 public TopicModel GetTopicModel(Guid id) { TopicModel topicModel = null; using (var context = new onenessEntities()) { var topic = cont

我尝试了许多不同的方法,并且LINQ语句中的“topic”总是空的。在将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将GUI存储为二进制blob造成的。作为解决方法,我将数据类型从GUID更改为CHAR(36),现在可以使用LINQ到EF来检索记录。我仍然想看看是否有人能回答这个原始问题。

我想知道where子句
x=>x.Id.Equals(Id)
生成了什么SQL?我找到了一个链接,它讨论了表达式分析器中的一个错误,如果id恰好是一个可为空的唯一标识符


建议的修复方法是以这种方式使用Equals:
x=>Object.Equals(x.Id,Id)
我将Id的数据类型更改为CHAR,而不是GUID,以解决此问题。

要解决此问题,请将其附加到连接字符串中:

);binaryguid=False

如果为true,则GUID列以二进制形式存储;否则,GUID列将存储为文本。我认为这个问题是由EF注入参数的方式(Type=AnsiStringFixedLength)引起的

当使用原始查询(带执行读取器的SQLiteCommand)时,使用guid参数的查询仍然可以与binaryguid配合使用。避免EF可以让您自己提供

command.Parameters.Add(new SQLiteParameter(DbType.Guid)
{
    ParameterName = "@id",
    Value = id
});

我将生成的SQL添加到原始post.x=>Object.Equals(x.Id,Id)生成此错误{“无法将类型'System.Guid'强制转换为类型'System.Object'。LINQ to Entities仅支持强制转换EDM基元或枚举类型。}生成的SQL看起来不错,因为参数出现在正确的位置以进行有效比较,但是您的数据类型不匹配。我猜数据库中的
[Topic].[Id]
是一个blob数据类型,您需要将
Id
@p\u linq\u 0
放入相同的数据类型中进行比较。在这一点上,我对SQLLite的了解已经到了极限,但是我确实发现这篇讨论可能会有所帮助。谢谢,我也看到了那篇文章。对我来说,将ID存储为文本似乎比在查询期间生成新的GUID更有效。还发现了一篇关于向连接字符串添加环境变量以告诉SQLite不要将GUID存储为blob的文章,但我无法让它在visual studio中使用EF连接字符串。