Если я проецирую с linq и не использую переменную диапазона, каков правильный синтаксис? - PullRequest
0 голосов
/ 19 мая 2010

У меня есть запрос, который суммирует и объединяет множество данных примерно так:

var anonType = from x in collection
               let Cars = collection.Where(c=>c.Code == "Cars")
               let Trucks = collection.Where(c=>c.Code == "Trucks")
               select new { 
                           Total = collection.Sum(v=>v.Amount),
                           CarValue = Cars.Sum(v=>v.Amout),
                           TruckValue = Trucks.Sum(v=>v.Amount),
                           CarCount = Cars.Count(),
                           TruckCount = Trucks.Count()
               };

Мне действительно странно, что я должен объявить переменную диапазона x, особенно если я не использую ее. Итак, я делаю что-то не так или есть другой формат, которому я должен следовать?

Ответы [ 3 ]

3 голосов
/ 19 мая 2010

Я могу ошибаться, но из-за вашего использования я не думаю, что вы все равно захотите выполнить традиционный синтаксический запрос выражения запроса к вашей коллекции, так как кажется, что вы ищете только агрегаты.Как бы вы это ни написали, вы будете извлекать несколько копий агрегированных данных, потому что вы делаете это для каждого из элементов в коллекции .Если вы хотите, вы можете разделить ваш запрос следующим образом (примеры свойств)

var values = collection.Where(c => c.Code == "A");
var anonType = new
               {
                   Sum = values.Sum(v => v.Amount),
                   MinimumStartDate = values.Min(v => v.StartDate),
                   Count = values.Count()
               };
1 голос
/ 19 мая 2010

Итак, я что-то не так делаю?

Ваш запрос не очень хорош. Для каждого элемента коллекции вы перечисляете коллекцию 5 раз (стоимость = 5 * n ^ 2).

Есть ли другой формат, которому я должен следовать?

Можно перечислить коллекцию 5 раз (стоимость = 5n).

IEnumerable<X> cars = collection.Where(c => c.Code == "Cars");
IEnumerable<X> trucks = collection.Where(c => c.Code == "Trucks");

var myTotals = new 
{
  Total = collection.Sum(v => v.Amount),
  CarValue = cars.Sum(v => v.Amount),
  TruckValue = trucks.Sum(v => v.Amount,
  CarCount = cars.Count(),
  TruckCount = trucks.Count()
};
1 голос
/ 19 мая 2010

Вы объявляете переменную диапазона независимо от конструкции цикла:

foreach(var x in collection)

или

for(var index = 0; index < collection.Count; index++)

или

var index = 0;

while(index < collection.Count)
{
    //...

    index++;
}

Запросы ничем не отличаются. Только не используйте переменную, это ничего не повредит.

...