gpt4 book ai didi

c# - Entity Framework 4 和 Linq : OrderBy a field nested in a Query : refactor my code

转载 作者:太空宇宙 更新时间:2023-11-03 11:42:54 24 4
gpt4 key购买 nike

首先,Thomas Levesque对于关系可能并不总是存在的相关表中的字段排序有一个很好的解决方案:

userQuery = userQuery.OrderBy(u => 
(u.Department != null) ? u.Department.Name : String.Empty);

我需要做同样的事情。我的聚合根很大:

myQuery = myQuery.OrderBy(p =>
(p.Seconds == null
? 0
: p.Seconds.FirstOrDefault() == null
? 0
: p.Seconds.First().Thirds == null
? 0
: p.Seconds.First().Thirds.FirstOrDefault() == null
? 0
: p.Seconds.First().Thirds.First().Forths == null
? 0
: p.Seconds.First().Thirds.First().Forths.FirstOrDefault() == null
? 0
: p.Seconds.First().Thirds.First().Forths.First().myField));

这真的是这样做的方法,还是有更容易阅读的方法?我的另一个问题是嵌套的 myField 在顶级查询中有一个匹配的“默认”值,也由 myField 命名。这个想法是通过合并这两个字段来排序 (??)。

编辑:我认为这将包括第一个字段中的“默认值”:

myQuery = myQuery.OrderBy(p =>
(p.Seconds == null
? p.myDefaultField // Used to be zero
: p.Seconds.FirstOrDefault() == null
? p.myDefaultField
: p.Seconds.First().Thirds == null
? p.myDefaultField
: p.Seconds.First().Thirds.FirstOrDefault() == null
? p.myDefaultField
: p.Seconds.First().Thirds.First().Forths == null
? p.myDefaultField
: p.Seconds.First().Thirds.First().Forths.FirstOrDefault() == null
? p.myDefaultField
: p.Seconds.First().Thirds.First().Forths.First().myField));

我如何重写此 OrderBy 以使其更清晰?此代码失败并出现错误“无法比较类型为‘System.Collections.Generic.IEnumerable`1’的元素。只有原始类型(例如支持 Int32、String 和 Guid)和实体类型。”

最佳答案

我认为你这里有一种非常讨厌的代码味道,但使用你所拥有的东西我不会在这样的 LINQ 查询中处理它。只是为了可读性,我会做类似的事情

myQuery = myQuery.OrderBy(p =>
(p.HasValidFields()
? p.Seconds.First().Thirds.First().Forths.First().myField
: p.myDefaultField
));

在 p 的类中

private bool HasValidFields
{
get
{
return p.Seconds != null &&
p.Seconds.FirstOrDefault() != null &&
.... ;
}
}

关于c# - Entity Framework 4 和 Linq : OrderBy a field nested in a Query : refactor my code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4242487/

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