Получить значения таблицы в коллекции для одного и того же значения в любой строке, используя LINQ - PullRequest
0 голосов
/ 12 августа 2010

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

  • ID HValue Limit
  • 0005 0 350,00
  • 0005 1 0,00
  • 0005 2 350,00
  • 0005 3 350,00
  • 0025 0 20,00
  • 0025 1 0,00

Я выполнил сохраненный процесс и сохранил эти значения в объекте DataTable. Теперь я хотел бы написать запрос Linq, который получит список Коллекция значений с одинаковым идентификатором.

Понравилось: за 0005 - 1-й список [0,1,2,3] 2-й список [350,0,350,0]

У меня есть 2 вопроса, 1. Можно ли получить этот тип результата с помощью запроса linq? 2. Как можно лучше написать это?

Любые предложения будут высоко оценены

Ответы [ 3 ]

0 голосов
/ 12 августа 2010
var groups = table
    .AsEnumerable()
    .GroupBy(row => row.Field<int>("ID"))
    .Select(grp => new { Id = grp.Key, Values = grp.Select(r => r.Field<int>("HValue")) });

foreach(var group in groups)
{
    int id = group.Id;
    IEnumerable<int> values = group.Values;
}
0 голосов
/ 27 октября 2010

Вы можете группировать по фильтру идентификаторов по количеству> 1 и выбрать идентификатор и каждый требуемый список проекций свойств в качестве анонимного типа.

    [TestMethod]
    public void TestMethod()
    {

        var list = 
            new[]
                {
                    new {Id = 0005, HValue = 0, Limit = 350}, 
                    new {Id = 0005, HValue = 1, Limit = 0}, 
                    new {Id = 0005, HValue = 2, Limit = 350}, 
                    new {Id = 0005, HValue = 3, Limit = 350}, 
                    new {Id = 0025, HValue = 0, Limit = 20}, 
                    new {Id = 0025, HValue = 1, Limit = 0}
                };

        var query =
            from row in list
            group row by row.Id
            into groupedById
            where groupedById.Count() > 1
            select
                new
                    {
                        Id = groupedById.Key,
                        HValueCollection = groupedById.Select(x => x.HValue),
                        LimitCollection = groupedById.Select(x => x.Limit)
                    };

        Assert.AreEqual(2, query.Count());

        var firstResult = query.First();
        Assert.AreEqual(0005, firstResult.Id);
        Assert.AreEqual(4, firstResult.HValueCollection.Distinct().Count());
        Assert.AreEqual(2, firstResult.LimitCollection.Distinct().Count());

        var lastResult = query.Last();
        Assert.AreEqual(0025, lastResult.Id);
        Assert.AreEqual(2, lastResult.HValueCollection.Distinct().Count());
        Assert.AreEqual(2, lastResult.LimitCollection.Distinct().Count());
    }

Приветствия!

0 голосов
/ 12 августа 2010

Вы можете сделать это с группировкой. IGrouping представляет ключ и коллекцию IEnumerable элементов, связанных с этим ключом. Таким образом, IGrouping может идеально представлять данные, которые вы ищете:

Group1: Ключ = 0005 Сбор = [0, 1, 2, 3]

Запросите это в linq, используя предложение group to (при условии, что ваш набор данных - myDataSet):

var groups = from row in myDataSet
group tempid by row.id into g
select new {id=tempid, HValue = g.HValue, Limit=g.Limit, IsEligible=g.IsEligible};
...