如何从 Entity Framework 核心数据库调用中获取 Option<T>?

How do I get an Option<T> from an Entity Framework Core database call?

抱歉,如果这是一个愚蠢的问题,但我正在努力 Language-Ext,而且似乎无法找到一个巧妙的方法来做到这一点。

在非功能代码中,我可以做这样的事情...

async Task DoFerretStuff(string id) {
  Ferret? ferret = await ctx.Ferrets.FirstOrDefaultAsync(f => f.id == id);
  if (ferret == null) {
    // Do whatever needs doing when we can't find the ferret
  } else {
    // Do ferret stuff
  }
}

我正在尝试以一种更实用的方式来做这件事,并假设我能够做这样的事情...

async Task<Unit> DoFerretStuff(string id) =>
  new Option<Ferret>(await ctx.Ferrets.FirstOrDefaultAsync(f => f.Id == id))
    .Match(ferret => {
      // Do ferret stuff
      return unit;
    },
    () => {
      // Do whatever needs doing when we can't find the ferret
      return unit;
    });

但是,这会在第一行给出编译器错误...

cannot convert from 'Ferret' to 'System.Collections.Generic.IEnumerable'

我不明白为什么,因为我认为你可以将一个(可能为 null)对象传递给 Option<T> 的构造函数,它会给出 Some<T>None<T>.

请有人解释我应该如何以实用的方式做这种事情。

谢谢

Option 构造函数 takes an IEnumerable<A> as argument,它解释了编译器错误。

试试 the static Prelude.Optional function。其中一个重载采用可为 null 的值并将其转换为 Option<A>.

综上所述,如果您想事后立即 Match 执行另一个副作用,那么与 if/else 相比,您获得了什么?

FP 通常涉及将不可变值(例如 Option<Ferret>)传递给 pure function。该值可以来自不纯的操作,例如 ctx.Ferrets.FirstOrDefaultAsync,但它也可以只是当场创建的值。纯函数不会关心。