2010-09-06 2 views
0

У меня есть следующие LINQ условное где положение запроса, который дает результат весов:агрегатные функции в LINQ

От этого, я хотел бы взять набор результатов и присоединиться к другой таблицы, tblPurchases

var result = weights.Join(getsuppliersproducts.tblPurchases, 
    w => new { w.MemberId, w.MemberName, w.LocationId, w.UnitId }, 
    p => new { p.MemberId, p.MemberName, p.LocationId, p.UnitId }, 
    (w, p) => p); 

В этой второй таблице у меня есть два столбца, на которые я хотел бы выполнить функцию aggreagte, сумму на PurchaseQuantity и счетчик UnitID.

Таким образом, в сыром виде, tblPurchases будет выглядеть так:

MemberID LocationID UnitId SupplierID SupplierStatus Purchases 
1   1   ab  Sup1   Live   10 
1   1   abc  Sup1   Live   10 
1   1   abcd  Sup2   Dead   50 

Из моего набора данных результатов, я хотел бы выход выглядеть так:

MemberID LocationID SupplierID SupplierStatus UnitIdCount Total Purchases 
1   1   Sup1  Live   2    50 

Кроме того, с этим поправки, могу ли я вернуть это в список?

Как реализовать это с помощью LINQ? Я пробовал и терпел неудачу.

(Для тех, кто видел мои предыдущие посты, я стараюсь, чтобы покрыть все углы, так что я могу полностью понять суть того, что происходит как в SQL и LINQ)

+0

В чем заключаются условия, при которых статья имеет отношение к фактическому вопросу? – Steven

+0

Ничего подобного, просто иллюстрируя, как я пришел к объекту «веса». –

+0

Пожалуйста, удалите эту информацию, потому что она загромождает вопрос. – Steven

ответ

1

Этот запрос будет возвращать IEnumerable где каждая из покупок совпадает с MemberId, MemberName, LocationId и UnitId в исходном запросе. Вы можете легко сделать только один агрегат за раз, поэтому

var result = weights.Join(getsuppliersproducts.tblPurchases, 
    w => new { w.MemberId, w.MemberName, w.LocationId, w.UnitId }, 
    p => new { p.MemberId, p.MemberName, p.LocationId, p.UnitId }, 
    (w, p) => p).ToList(); 

Int32 count = result.Count(); 
Double quantity = result.Sum(p => p.PurchaseQuantity); 

Это то, что вы пытаетесь сделать?

EDIT, после вашего ответа Я хотел бы повторно указать список tblПокупки с двумя новыми столбцами, суммой количества покупки и количества единиц измерения.

Это дает плоский вывод:

var query = Weights.GroupJoin(
    Purchases, 
    w => new {w.MemberId, w.LocationId}, 
    p => new {p.MemberId, p.LocationId}, 
    (w,p) => new {w.MemberId, w.LocationId, Count = p.Count(), Sum = p.Sum(x => x.Purchases)}); 

Обратите внимание, что в точке мы делаем (ш, р) => новый {}, что ш является единственным Вес и р представляет собой список покупок соответствия этот вес, так что вы все равно можете сохранить все данные (иерархические):

var query = Weights.GroupJoin(
    Purchases, 
    w => new {w.MemberId, w.LocationId}, 
    p => new {p.MemberId, p.LocationId}, 
    (w,p) => new {w.MemberId, w.LocationId, Count = p.Count(), Sum = p.Sum(x => x.Purchases), Purchases = p}); 
+0

Привет Amaca - Я хотел бы повторно указать список tblPurchases с двумя новыми столбцами, суммой количества покупки и количества идентификаторов устройства. –

+0

Это блестяще - спасибо Amaca, что действительно помогло мне понять. –

Смежные вопросы