2015-07-21 3 views
0

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

Примеры данных

PricingID Name Age Group 
1   abc 56 P1 
1   abc 56 P2 

Output should be : 
PricingID Name Age Group 
1   abc 56 P1,P2 

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

List<PricingDetailExtended> pricingDetailExtendeds = _storedProcedures.GetPricingAssignment(pricingScenarioName, regionCode, productCode, stateCode, UserId, PricingId).ToList(); 
      var pricngtemp = pricingDetailExtendeds.Select(e => new 
      { 
       PricingID = e.PricingID, 
       OpportunityID = e.OpportunityID, 
       ProductName = e.ProductName, 
       ProductCD = e.ProductCD 
      }); 

      pricingDetailExtendeds.ForEach(e=> 
       { 
        e.ProductCD = string.Join(",",string.Join(",", (pricngtemp.ToList().Where(p => p.PricingID == e.PricingID).Select(k => k.ProductCD).ToArray())).Split(',').Distinct().ToArray()); 
        e.OpportunityID =string.Join(",", string.Join(",", (pricngtemp.ToList().Where(p => p.PricingID == e.PricingID).Select(k => k.OpportunityID).ToArray())).Split(',').Distinct().ToArray()); 
        e.ProductName =string.Join(",", string.Join(",", (pricngtemp.ToList().Where(p => p.PricingID == e.PricingID).Select(k => k.ProductName).ToArray())).Split(',').Distinct().ToArray());    


       } 
       ); 

      // pricingDetailExtendeds = GetUniquePricingList(pricingDetailExtendeds); 

      return pricingDetailExtendeds.Distinct().AsEnumerable(); 

Любой орган может предложить мне лучший подход и как исправить эту проблему?

Любая помощь приветствуется.

+0

Где имя и возраст входят в код? И наоборот, где OpportunityID входит в таблицу? –

+0

Из Salesforce он входит в нашу базу данных DB. Идентификатор цен может иметь несколько оппортунити и если есть несколько oppurtunityid для одного ценообразования, я должен показать как одну строку – user662285

+0

Где имя и возраст? –

ответ

1

Вы хотите использовать функцию linq GroupBy.

Затем я использую функцию String.Join, чтобы сделать группы разделенными запятыми.

Так что-то вроде этого:

var pricingDetailExtendeds = new[] 
     { 
      new 
      { 
       PricingID = 1, 
       Name = "abc", 
       Age = 56, 
       Group = "P1" 
      }, 
      new 
      { 
       PricingID = 1, 
       Name = "abc", 
       Age = 56, 
       Group = "P2" 

      } 
     }; 
     var pricngtemp = 
      pricingDetailExtendeds.GroupBy(pde => new {pde.PricingID, pde.Name, pde.Age}) 
       .Select(g => new {g.Key, TheGroups = String.Join(",", g.Select(s => s.Group))}).ToList(); 

Вы можете легко экстраполировать это на других областях.

Чтобы вернуть PricingDetailExtended, просто создайте его в списке. Так что-то вроде этого

.Select(g => new PricingDetailExtended { 
    PricingID = g.Key.PricingId, 
    TheGroups = String.Join(",", g.Select(s => s.Group)) 
}).ToList(); 

Вы не будете иметь поле TheGroups хотя, так что просто заменить это поле с соответствующим одним.

+0

вар pricngtemp = pricingDetailExtendeds.GroupBy (е => новый { PricingID = e.PricingID, OpportunityID = e.OpportunityID, ProductName = e.ProductName, ProductCD = e.ProductCD }). Выберите (г => new {g.Key, TheGroups = String.Join (",", g.Select (s => s.ProductCD))}) ToList(); return priceDetailExtendeds.Distinct(). AsEnumerable(); – user662285

+0

Это не работает, что мне не хватает – user662285

+0

Две вещи: 1) вы включили «ProductCD» в свою группу, вы хотите создать группу продуктов на основе некоторых критериев, поэтому не включайте продукты 2) 't нужно 'Distinct()' –

1

Примером того, что я описывал в своем комментарии, было бы что-то вроде следующих. Я ожидаю, что это будет перенесено в вспомогательную функцию.

List<PriceDetail> list = new List<PriceDetail> 
{ 
    new PriceDetail {Id = 1, Age = 56, Name = "abc", group = "P1"}, 
    new PriceDetail {Id = 1, Age = 56, Name = "abc", group = "P2"}, 
    new PriceDetail {Id = 2, Age = 56, Name = "abc", group = "P1"} 
}; 

Dictionary<PriceDetailKey, StringBuilder> group = new Dictionary<PriceDetailKey, StringBuilder>(); 

for (int i = 0; i < list.Count; ++i) 
{ 
    var key = new PriceDetailKey { Id = list[i].Id, Age = list[i].Age, Name = list[i].Name };    
    if (group.ContainsKey(key)) 
    { 
     group[key].Append(","); 
     group[key].Append(list[i].group); 
    } 
    else 
    { 
     group[key] = new StringBuilder(); 
     group[key].Append(list[i].group); 
    } 
} 

List<PriceDetail> retList = new List<PriceDetail>(); 
foreach (KeyValuePair<PriceDetailKey, StringBuilder> kvp in group) 
{ 
    retList.Add(new PriceDetail{Age = kvp.Key.Age, Id = kvp.Key.Id, Name = kvp.Key.Name, group = kvp.Value.ToString()}); 
} 

вы можете даже преобразовать конечный цикл в выражение LINQ, как:

group.Select(kvp => new PriceDetail {Age = kvp.Key.Age, Id = kvp.Key.Id, Name = kvp.Key.Name, group = kvp.Value.ToString()}); 

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

Существует несколько различных способов получения результатов. Вы даже можете сделать группировку в SQL.

+0

Где вы делаете 2 строки в одном? см. примеры данных выше .. как результат должен быть? – user662285

+0

Я делаю это в первом цикле for. Запустите пример, он делает то, что вы хотите. Я использую ' Словарь 'для проверки дубликатов. Когда я нахожу дубликат, я добавляю только соответствующие данные в' StringBuilder' и никогда не добавляю новую строку в 'Словарь'. Тогда« Словарь »будет содержать отдельные строки с соответствующими данными из исключены строки. – Taekahn

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