【发布时间】:2013-01-09 20:29:15
【问题描述】:
有一个返回 IEnumerable<User> 的方法,我一直在使用 Linq / Entity Framework / SQL Server 来返回结果。
我遇到了一个困难的条件 scenario,这在 C# 迭代 Web 服务器上更容易解决(在 linq 语句链的末尾,就在将数据返回给客户端之前):
public IEnumerable<User> ReturnUsersNotInRoles()
{
IQueryable<User> z = (from users
//...many joins..conditions...
).Distinct().Include(x => x.RoleUserLinks).ToList()
IEnumerable<User> list = new List<User>();
foreach (User user in z)
{
bool shouldReturnUser = true;
foreach (var rul in user.RoleUserLinks)
{
if (rul.LinkStatusID == (byte)Enums.LinkStatus.Added)
shouldReturnUser = false;
}
if (shouldReturnUser)
list.Add(user);
}
return list;
}
问题:在 C# 中是否有一种性能更高/内存开销更少的方法?
我只是从 Linq 带回我需要的实体。没有N+1 场景。目前的表现非常出色。
我意识到理想情况下我会在 SQL/Linq 中编写它,因为这样 SQL Server 会发挥它的魔力并快速为我提供数据。但是,我正在平衡这与潜在的难以理解的查询,以及当前具有迭代的出色性能,以及易于理解 C# 方式。
【问题讨论】: