【问题标题】:How to linq filter on multiple GUID at once generating an appropriate sql where clause如何一次对多个 GUID 进行 linq 过滤,生成适当的 sql where 子句
【发布时间】:2016-06-24 09:52:57
【问题描述】:

我很难在连接到 sqlite 数据库的 Entity Framework core rc2-final 中使用 fluent API 生成正确过滤的 sql 查询。

我有以下简单实体:

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')

正如代码中所预期的那样,尽管 ID 完全有效,但这会返回 0 个项目。 Sqlite 上的 Guid 存储在 Blob 中,尽管 EF-Core 似乎可以很好地处理单项过滤器的过滤器,但在这种情况下似乎无法处理。

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

ps:我想要的最后一件事是让 EF Core 从 db 下载整个 Thing 集合,然后对其进行过滤!在我的情况下,这将是疯狂的。

【问题讨论】:

    标签: c# sqlite entity-framework-core fluent


    【解决方案1】:

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

    【讨论】:

    • 好的,感谢您的反馈。将列映射到byte[] 属性将是我项目中的一项重要工作。我们有近 100 个实体,每个实体至少有 2 个 Guid。以及许多对这些指南的引用。不用太仔细研究下一步如何进行,它已经可以预见到令人头疼的问题。 “现在”(tm)我可能会选择像externalList.Foreach(externalItem =&gt; db.Things.Where(o =&gt; externalItem.Id == o.Id))这样的异常......也会让你的脊椎发抖,对吗? :)
    • 该修复程序现在也在nightly builds 中,如果这是一个选项...
    • 是的,确实好多了。我知道我们距离 1.0.1 版的生产时间还很远,但你认为官方 nuget 版本会在 9 月之前发布吗?同时,我会接受这个答案,因为这是目前最好的选择。
    • 我无法回答。 ;-) 但我上次听说,我们正在争取与 VS 更新大致相同的节奏——每三到四个月一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2014-05-10
    • 2020-03-21
    • 1970-01-01
    • 2018-03-10
    • 2011-02-16
    • 2012-05-06
    相关资源
    最近更新 更多