2016-06-24 17 views
0

我有一个很难在连接到的SQLite数据库实体框架核心RC2决赛产生用流利的API正确过滤的SQL查询。如何LINQ过滤器上的多个GUID立刻产生适当的SQL WHERE子句

我有以下简单的实体:

public class Thing 
{ 
    [Required, Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 

    public string Name { get; set; } 
} 

我需要在数据库中查询是在书籍我提供的一个藏匿处列表中的所有书籍。迄今为止,听起来很容易。这就是我们怎么能写:

// 'GetShortListFromSomewhere' returns 2 items that ALREADY exist in db 
List<Thing> externalList = GetShortListFromSomewhere(); 
var result = db.Things.Where(thing => externalList.Contains(o.Id)).ToList(); 

,但会产生以下查询这是一种正确的,那种..不.. SQLite的:

SELECT "o"."Id", "o"."Name" FROM "Thing" AS "o" 
    WHERE "o"."Id" IN ('7edbc016-abfa-4005-83d1-b39618b047df', '2def16bb-4203-417d-847c-7bdf053a00e8') 

正如预期的代码,这虽然Ids是完全有效的,但会返回0项。关于Sqlite的Guid存储在Blob上,尽管EF-Core似乎很好地处理单个项目过滤器的过滤器,但在这种情况下它似乎无法处理它。

我怎样才能解决这个问题,知道我需要它是一个SQL操作?

ps:我想要的最后一件事是EF Core从db下载整个Thing集合,然后过滤它!这对我来说会是疯狂的。

回答

0

这是问题#5801。不幸的是,它不会被修复为1.0.0版本。要解决该问题,请将列映射到byte[]属性。

+0

好的,谢谢你的反馈。将列映射到'byte []'属性将是我项目中的一项重要工作。我们有近100个实体,每个实体至少有2个Guid。许多许多这些指导参考。如果不仔细观察如何继续下一步,它已经可以预见到一个很好的头痛。 “现在”(tm)我可能会像'externalList.Foreach(externalItem => db.Things.Where(o => externalItem.Id == o.Id))'''一样发生像差。 , 对 ? :) – DarkUrse

+0

现在修复也在[nightly builds](http://myget.org/gallery/aspnetvnext),如果这是一个选项... – bricelam

+0

是的,确实好多了。我知道我们距版本1.0.1的生产时间还很遥远,但是你认为官方nuget版本将在9月份之前上市吗?与此同时,我会接受这个答案,因为这是目前最好的选择。 – DarkUrse