gpt4 book ai didi

c# - 递归linq查询

转载 作者:行者123 更新时间:2023-11-30 18:00:50 24 4
gpt4 key购买 nike

我有以下对象结构。

public class Study 
{
public Guid? PreviousStudyVersionId { get; set; }
public Guid StudyId { get; set; }
//Other members left for brevity
}

它首先使用实体​​框架代码进行持久化。

结果是这样的表格

PreviousStudyVersionId                  StudyId
EF90F9DC-C588-4136-8AAE-A00E010CE87B E4315CFD-9638-4225-998E-A00E010CEEEC
NULL 1C965285-788A-4B67-9894-3D0D46949F11
1C965285-788A-4B67-9894-3D0D46949F11 7095B746-8D32-4CC5-80A9-A00E010CE0EA
7095B746-8D32-4CC5-80A9-A00E010CE0EA EF90F9DC-C588-4136-8AAE-A00E010CE87B

现在我要查询所有studyId的递归。所以我想出了以下解决方案:

因此,当我在我的存储库 GetAllStudyVersionIds(new Guid("7095B746-8D32-4CC5-80A9-A00E010CE0EA")) 中调用该方法时,它会返回所有 4 个 studyId。

    public IEnumerable<Guid> GetAllStudyVersionIds(Guid studyId)
{
return SearchPairsForward(studyId).Select(s => s.Item1)
.Union(SearchPairsBackward(studyId).Select(s => s.Item1)).Distinct();
}

private IEnumerable<Tuple<Guid, Guid?>> SearchPairsForward(Guid studyId)
{
var result =
GetAll().Where(s => s.PreviousStudyVersionId == studyId).ToList()
.Select(s => new Tuple<Guid, Guid?>(s.StudyId, s.PreviousStudyVersionId));
result = result.Traverse(a => SearchPairsForward(a.Item1));
return result;
}

private IEnumerable<Tuple<Guid, Guid?>> SearchPairsBackward(Guid studyId)
{
var result = GetAll().Where(s => s.StudyId == studyId).ToList()
.Select(s => new Tuple<Guid, Guid?>(s.StudyId, s.PreviousStudyVersionId));
result = result.Traverse(a => a.Item2.HasValue ? SearchPairsBackward(a.Item2.Value) : Enumerable.Empty<Tuple<Guid, Guid?>>());
return result;
}

这是我的扩展方法的实现。

public static class MyExtensions
{
public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> fnRecurse)
{
foreach (var item in source)
{
yield return item;
var seqRecurse = fnRecurse(item);
if (seqRecurse == null) continue;
foreach (var itemRecurse in Traverse(seqRecurse, fnRecurse))
{
yield return itemRecurse;
}
}
}
}

有没有办法将其移近数据库(IQueryable)并优化此代码。

最佳答案

我是通过创建一个递归表函数来根据 id 提取所有父记录,然后创建一个 View 来为每条记录和所有父记录生成一个列表来完成此操作的。然后我在 EF 模型中使用它并关联以便能够与 LINQ 一起使用。

关于c# - 递归linq查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9635051/

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