IEnumerable<User>
結果を返すためにLinq/Entity Framework /SQLServerを使用していたものを返すメソッドがあります。
難しい条件付きシナリオに遭遇しました。これは、WebサーバーでのC#反復ではるかに簡単に解決されました(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がその魔法を実行し、データをすばやく提供してくれるからです。ただし、これと、理解するための潜在的にv.hardのクエリ、現在の反復による優れたパフォーマンス、およびC#の方法の理解のしやすさのバランスを取っています。