c # лямбда-выражение, использующее Sum для множественных сравнений - PullRequest
0 голосов
/ 09 марта 2012

Я пытаюсь использовать метод Sum в лямбда-выражении для сравнения, но я хочу использовать его для множественных сравнений. Как мне это сделать? Я посмотрел на «Позвольте» и «SelectMany», но я не смог найти ответ.

Ниже приведен код:

return _dbContext.All<Table>()
            .Where(table => table.CurrentLevel <= salesCriteria.MaxTableLevel)
            .Where(table =>  table.Leg
                            .Where(leg=> salesCriteria.StartDate <= leg.AddDate)
                            .Where(leg=> leg.AddDate <= salesCriteria.EndDate)
                            .Sum(leg => leg.Width) <= salesCriteria.MaxGoalAmount);

Как вы видите, я пытаюсь получить все таблицы с определенными критериями, у которых есть Legs с определенными критериями и ширина которых все складывается, чтобы быть меньше определенного значения. Я также хотел бы убедиться, что сумма больше определенного минимального значения. Тем не менее, я не могу сделать это здесь, так как, как только я делаю. Сумма, я теряю список. Так как бы мне это сделать здесь? Все, что я хочу, это minValue <= .Sum () <= maxValue </p>

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Звучит так, будто вы хотите что-то вроде:

return _dbContext.All<Table>()
        .Where(table => table.CurrentLevel <= salesCriteria.MaxTableLevel)
        .Select(table => new { 
           table, 
           legWidth = table.Leg
                           .Where(leg=> salesCriteria.StartDate <= leg.AddDate)
                           .Where(leg=> leg.AddDate <= salesCriteria.EndDate)
                           .Sum(leg => leg.Width)
        })
        .Where(x => x.legWidth <= salesCriteria.MaxGoalAmount &&
                    x.legWidth >= salesCriteria.MinGoalAmount)
        .Select(x => x.table);

Таким образом, Select здесь эквивалентно использованию let в выражении запроса.

В качестве выражения запроса это будет:

return from table in _dbContext.All<Table>()
       where table.CurrentLevel <= salesCriteria.MaxTableLevel
       let legWidth = table.Leg
                           .Where(leg=> salesCriteria.StartDate <= leg.AddDate)
                           .Where(leg=> leg.AddDate <= salesCriteria.EndDate)
                           .Sum(leg => leg.Width)
       where legWidth <= salesCriteria.MaxGoalAmount &&
             legWidth >= salesCriteria.MinGoalAmount
       select table;
0 голосов
/ 09 марта 2012

Чтобы получить мощность let, вам нужно переключиться с синтаксиса цепочки методов на синтаксис выражения запроса. Попробуйте это:

var goodTables = 
    from table in _dbContext.All<Table>()
    where table.CurrentLevel <= salesCriteria.MaxTableLevel
    let sumOfWidthOfGoodLegs = 
        table.Leg
        .Where(leg=> salesCriteria.StartDate <= leg.AddDate)
        .Where(leg=> leg.AddDate <= salesCriteria.EndDate)
        .Sum(leg => leg.Width)    
    where sumOfWidthOfGoodLegs <= salesCriteria.MaxGoalAmount
    // can insert another where on sumOfWidthOfGoodLegs here as required
    select table;

return goodTables.ToList();

Замечу, что это проверка ширины только хороших ножек - я не уверен, что это то, что вы хотите, но это то, что вы делаете в настоящее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...