gpt4 book ai didi

c# - 添加 LINQ 或 DBContext 扩展方法以获取元素(如果不存在)然后使用谓词中的数据创建 (FirstOrCreate)

转载 作者:太空狗 更新时间:2023-10-29 23:39:37 25 4
gpt4 key购买 nike

我正在尝试添加 LINQ 或 DbContext 扩展方法来获取元素 (FirstOrDefault),但如果一个元素尚不存在,则创建一个包含数据的新实例 (FirstOrCreate) 而不是返回 null。

这可能吗?

即:

public static class LINQExtension
{
public static TSource FirstOrCreate<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate)
{
if (source.First(predicate) != null)
{
return source.First(predicate);
}
else
{
return // ???
}
}
}

用法可能是:

using (var db = new MsBoxContext())
{
var status = db.EntitiesStatus.FirstOrCreate(s => s.Name == "Enabled");
//Here we should get the object if we find one
//and if it doesn't exist create and return a new instance

db.Entities.Add(new Entity()
{
Name = "New Entity",
Status = status
});
}

我希望你理解我的方法。

最佳答案

public static class LINQExtension
{
public static TSource FirstOrCreate<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, bool>> predicate,
Func<T> defaultValue)
{
return source.FirstOrDefault(predicate) ?? defaultValue();
}
}

用法

var status = db.EntitiesStatus.FirstOrCreate(s => s.Name == "Enabled", 
() => new EntityStatus {Name = "Enabled"});

但是您必须注意,这不会像 FirstOrDefault() 那样工作。

如果你做了以下

var listOfStuff = new List<string>() { "Enabled" };
var statuses = from s in listOfStuff
select db.EntitiesStatus.FirstOrCreate(s => s.Name == "Enabled",
() => new EntityStatus {Name = "Enabled"});

您将对数据库进行 O(n) 次访问。

但是我怀疑你是否...

var listOfStuff = new List<string>() { "Enabled" };
var statuses = from s in listOfStuff
select db.EntitiesStatus.FirstOrDefault(s => s.Name == "Enabled")
?? new EntityStatus {Name = "Enabled"};

它似乎可以工作......

关于c# - 添加 LINQ 或 DBContext 扩展方法以获取元素(如果不存在)然后使用谓词中的数据创建 (FirstOrCreate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16848271/

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