gpt4 book ai didi

c# - 如何从 Entity Framework Core 数据库调用中获取 Option

转载 作者:行者123 更新时间:2023-12-05 05:40:49 24 4
gpt4 key购买 nike

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

关于c# - 如何从 Entity Framework Core 数据库调用中获取 Option<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72338779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com