Сложный запрос LINQ с группировками (нужна помощь) - PullRequest
0 голосов
/ 02 апреля 2012

Надеюсь, кто-то может помочь со следующим сценарием.У меня есть таблица в sql, и я пытаюсь вернуть все записи, которые соответствуют значению.Эта логика может иметь И на основе группы.Например,

Идентификатор строки Соответствие Значение Равная группа

1 >>> 1 >>> 1 >>> a >>> a >>> 1

2 >>> 1 >>> a >>> b >>> 0 >>> 1

3 >>> 2 >>> a >>> a >>> 1 >>> 2

4 >>> 3 >>> b >>> c >>> 0 >>> 3

5 >>> 4 >>> a >>> a >>> 1 >>> 4

В этом случае 1 в столбце равно означает «равно», а 0 означает «не равно»

Этот набор данных после linqed будет возвращать записи 1, 2, 3, поскольку в строке 1a = (из столбца равно) a И a! = (из столбца равно) b.Строки 1 и 2 являются «И», потому что они находятся в одной группе.И так далее.

Спасибо!

1 Ответ

1 голос
/ 13 апреля 2012

Не уверен, что это именно то, к чему вы стремитесь, потому что ваш вопрос труден для понимания, и кажется, что данные вашего примера могут содержать несколько опечаток. Тем не менее, я смоделировал нечто подобное для вас ниже. Обратите внимание, что я изменил строку 1, потому что похоже, что у вас была опечатка, и я изменил строку 5, чтобы это на самом деле было исключенным случаем, в противном случае вы получили бы все.

public class Test
{
    public int Row {get; set;}
    public int ID {get; set;}
    public string Match {get; set;}
    public string Value {get; set;}
    public int Equal {get; set;}
    public int Group {get; set;}
}

void Main()
{
    var items = new List<Test>();
    items.Add(new Test() {Row = 1, ID = 1, Match = "a", Value = "a", Equal = 1, Group = 1});
    items.Add(new Test() {Row = 2, ID = 1, Match = "a", Value = "b", Equal = 0, Group = 1});
    items.Add(new Test() {Row = 3, ID = 2, Match = "a", Value = "a", Equal = 1, Group = 2});
    items.Add(new Test() {Row = 4, ID = 3, Match = "b", Value = "c", Equal = 0, Group = 3});
    items.Add(new Test() {Row = 5, ID = 4, Match = "a", Value = "b", Equal = 1, Group = 4});

    var result = items.GroupBy(i => i.Group)
                 .Where(g => g.All(t => 
                          (t.Equal == 1 && t.Match == t.Value) || 
                          (t.Equal == 0 && t.Match != t.Value)))
                 .SelectMany(g => g.Select(i => i));

    foreach (var i in result)
    {
        Console.WriteLine("Row: {0}, ID: {1}", i.Row, i.ID);
    }

}

Результат:

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