Повторно использовать выражения LINQ - PullRequest
0 голосов
/ 20 февраля 2020

Пример ниже представляет собой простой запрос Linq to SQL, который вычисляет SecondsLeft, TotalSeconds и затем использует эти свойства SecondsPercentLeft. Как вы можете выяснить, SecondsPercentLeft содержит выражения Linq из SecondsLeft и TotalSeconds и буквально дублирует их. Любые предложения о том, как использовать выражения Linq?

Не предлагать перемещать отмену свойства SecondsPercentLeft в поля COMPUTED, потому что позже я использую WHERE, а Linq в SQL не знаю, как переводить поля COMPUTED, зависящие от других полей который имеет выражения Linq.

 var creditsLeftJobViews2 = _db.Users.Select(p => new UserView
            {
                Id = p.Id,
                Email = p.Email,
                FullName = p.FirstName + " " + p.LastName,
                SecondsLeft = p.Orders.Where(w => w.Active && (w.TransactionType == TransactionType.Order || w.TransactionType == TransactionType.Subscription))
                                  .Select(s => (int?) s.Seconds)
                                  .Sum() ?? 0,
                TotalSeconds = p.Orders.Where(w => w.Active && (w.TransactionType == TransactionType.Order || w.TransactionType == TransactionType.Subscription))
                                   .Select(s => (int?) s.Plan.Seconds)
                                   .Sum() ?? 0,
                SecondsPercentLeft =  (int)((double) (p.Orders.Where(w => w.Active && (w.TransactionType == TransactionType.Order || w.TransactionType == TransactionType.Subscription))
                                                          .Select(s => (int?) s.Seconds)
                                                          .Sum() ?? 0) / (p.Orders.Where(w => w.Active && (w.TransactionType == TransactionType.Order || w.TransactionType == TransactionType.Subscription))
                                                                              .Select(s => (int?) s.Plan.Seconds)
                                                                              .Sum() ?? 0) * 100)
            }).Where(w => w.SecondsPercentLeft <= 50).ToList();
...