如何从 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
,但它也可以只是当场创建的值。纯函数不会关心。
抱歉,如果这是一个愚蠢的问题,但我正在努力 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
,但它也可以只是当场创建的值。纯函数不会关心。