2

あまり良くないため、リファクタリングしようとしている linq コードがいくつかあります。

基本的に、次のことを実行するためのより良い方法があるかどうか疑問に思っています。

if (!string.IsNullOrWhiteSpace(_filter.AssignedTo)
{
var query = from ticket in dataClassesDataContext.TicketsIssues
            where ticket.ClosedDate == null 
            && cUser.GetUserNameUsingGUID(ticket.AssignTicketToUser) == _filter.AssignedTo                                                   
            select new
            {
                Priority = ticket.TicketPriority.TicketPriorityName,
                Description = ticket.Description.Replace("\n", ", "),
            };
}
else
{
var query = from ticket in dataClassesDataContext.TicketsIssues
            where ticket.ClosedDate == null 
            select new
            {
                Priority = ticket.TicketPriority.TicketPriorityName,
                Description = ticket.Description.Replace("\n", ", "),
            };
}

これらは、where 句が AssignTicketToUser のチェックであることを除けば、どちらも同一です。

if else ステートメントを使用する必要がないように、これを行うためのより良い方法があることを願っていますか? 私はこれらのコードブロックをいくつか持っていますが、コードをたくさん複製したくありません!

4

3 に答える 3

8
var query = from ticket in dataClassesDataContext.TicketsIssues
            where ticket.ClosedDate == null 
            && (string.IsNullOrWhiteSpace(_filter.AssignedTo) ? true : cUser.GetUserNameUsingGUID(ticket.AssignTicketToUser) == _filter.AssignedTo)                                                   
            select new
            {
                Priority = ticket.TicketPriority.TicketPriorityName,
                Description = ticket.Description.Replace("\n", ", "),
            };

if-else ステートメントを完全に取り除くことができます。if 条件を 2 番目の where 句に転送し、! を削除します。その 2 番目の where 句は三項演算子になります。

条件が true の場合、つまり _filter.AssignedTo が null の場合は、true を返して _filter.AssignedTo をテストしないでください。null または空でない場合は、元の else ブロックにあった句に進みます。

于 2012-12-14T02:02:19.443 に答える
3

1つの方法は次のとおりです。

var query = from ticket in dataClassesDataContext.TicketsIssues
            where ticket.ClosedDate == null 
            select new
            {
                Priority = ticket.TicketPriority.TicketPriorityName,
                Description = ticket.Description.Replace("\n", ", "),
            };

if (!string.IsNullOrWhiteSpace(_filter.AssignedTo)
    query = query.Where(w => cUser.GetUserNameUsingGUID(w.AssignTicketToUser) == _filter.AssignedTo));
于 2012-12-14T02:02:01.623 に答える
1

PredicateBuilder C#の実装を見てみましょう。一言で言えば、このAnd メソッドは、より一般的な方法でここでの問題に対処し、LINQと式ツリーの理解を深めるのに役立ちます。最終的には次のようになります。

var query = from ticket in dataClassesDataContext.TicketsIssues
            where ticket.ClosedDate == null
            select new
            {
                Priority = ticket.TicketPriority.TicketPriorityName,
                Description = ticket.Description.Replace("\n", ", "),
            };

if (!string.IsNullOrWhiteSpace(_filter.AssignedTo))
{
     query = query.And(ticket => cUser.GetUserNameUsingGUID(ticket.AssignTicketToUser) == _filter.AssignedTo);
}
于 2012-12-14T02:42:06.573 に答える