使用匿名类型 - 如何避免大量代码

gor*_*mit 2 c# asp.net linq-to-sql

我有这种情况:

if (condition){
   var variable = (from el in ....) //linq to sql query
 }
else{
   var variable = (from el in ....) //linq to sql query
 }

// code where i can`t use the variable
Run Code Online (Sandbox Code Playgroud)

我想避免在两种情况下复制代码.

var getHistoryTips = (from el in objDC.tickets
                      where el.typeOfGame == cANDu[0]
                      && el.username == Membership.GetUser(cANDu[1]).ProviderUserKey.ToString()
                      select new { el.AllGamesTickets, el.WGamesTickets}).FirstOrDefault();


var getHistoryTips = (from el in objDC.tickets
                      where el.typeOfGame == cANDu[0]
                      && el.results != null
                      && el.username == Membership.GetUser(cANDu[1]).ProviderUserKey.ToString()
                      select new { el.AllGamesTickets, el.WGamesTickets}).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

三种选择:

首先,您可以使用"示例" - 键入变量:

// Same anonymous type properties and types as later:
var variable = Enumerable.Repeat(0, new { ... });

if (condition) {
    variable = ...;
} else {
    variable = ...;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用条件运算符:

var variable = condition ? ... first query ...
                         : ... second query ...
Run Code Online (Sandbox Code Playgroud)

第三,您可以使用合成来构建查询.例如,如果唯一的区别是排序,您可以这样做:

var firstPart = ...;

var secondPart = condition ? query.OrderBy(...) : query.OrderByDescending(...);

var query = secondPart.Select(...);
Run Code Online (Sandbox Code Playgroud)

编辑:现在你举了一个例子,我们可以具体化:

string username = membership.GetUser(cANDu[1]).ProviderUserKey.ToString();
var query = objDC.tickets
                 .Where(el => el.typeOfGame == cANDu[0] &&
                              el.username == username);

if (condition)
{
    query = query.Where(el => el.results != null);
}

var result = query.Select(el => new { el.AllGamesTickets, el.WGamesTickets})
                  .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)