2015-08-13 2 views
0

Невозможно определить логику для получения всех записей, если переменная равна null else get where officername = officer.Получить все, если переменная равна null else get matching

 var res = (from h in db.BalanceHistories 
         where temp.Contains(h.LoanType ?? 0) 
         && ((officer != null && h.OfficerName.ToLower() == officer.ToLower()) || ("Get all records")) 
         group h by new { h.Date.Value.Month, h.Date.Value.Year } into p 
         select new 
         { 
          Month = p.Key.Month, 
          Year = p.Key.Year, 
          Count = p.Count(), 
          Balance = p.Sum(x => x.Balance), 
          Delinquent = p.Sum(x => x.Delinquent) 
         }).ToList(); 

ответ

0

Просто поменять ("Get all records") с (officer == null), хотя я хотел бы предложить вам поставить это условие на первый.

Объяснение:

Если officer == null, чем по отношению к короткого circut закона мы вернем true и остальная часть нашего состояния не будет иметь значения.

Else означает officer != null и таким образом мы хотим проверить, соответствует ли он нашим данным h.OfficerName.

Конечный результат:

res = (from h in db.BalanceHistories 
        where temp.Contains(h.LoanType ?? 0) 
        && (
         officer == null 
         || h.OfficerName.ToLower() == officer.ToLower()) 
        ) 
        group h by new { h.Date.Value.Month, h.Date.Value.Year } into p 
        select new 
        { 
         Month = p.Key.Month, 
         Year = p.Key.Year, 
         Count = p.Count(), 
         Balance = p.Sum(x => x.Balance), 
         Delinquent = p.Sum(x => x.Delinquent) 
        }).ToList(); 
1

Хотя вы можете сделать составной оператор if, это будет (обычно - в настоящее время всегда) передать этот составной оператор в базу данных. Во многих случаях это может привести к пропуску индекса, который, если все сделано правильно, не будет пропущен. На серверах Microsoft, отличных от Microsoft, эти типы запросов, как известно, просто не работают (MySQL, DB2). Это лучше просто написать запрос правильно в первую очередь:

var query = db.BalanceHistories 
    .Where(h=>temp.Contains(h.LoanType ?? 0)); 
if (officer!=null) 
{ 
    // Depending on your database, the ToLower()s here may not be needed. 
    query=query.Where(h=>h.OfficerName.ToLower() == officer.ToLower())) 
} 
var res=(from h in query 
     group h by new { h.Date.Value.Month, h.Date.Value.Year } into p 
     select new 
         { 
          Month = p.Key.Month, 
          Year = p.Key.Year, 
          Count = p.Count(), 
          Balance = p.Sum(x => x.Balance), 
          Delinquent = p.Sum(x => x.Delinquent) 
         }); 
0

Вы пробовали:

var res = (from h in db.BalanceHistories 
        where temp.Contains(h.LoanType ?? 0) 
        && ((officer == null) || (h.OfficerName.ToLower() == officer.ToLower())) 
        group h by new { h.Date.Value.Month, h.Date.Value.Year } into p 
        select new 
        { 
         Month = p.Key.Month, 
         Year = p.Key.Year, 
         Count = p.Count(), 
         Balance = p.Sum(x => x.Balance), 
         Delinquent = p.Sum(x => x.Delinquent) 
        }).ToList(); 
Смежные вопросы