Проблема с запросом linq - PullRequest
       3

Проблема с запросом linq

0 голосов
/ 28 августа 2011

У меня есть собственная таблица «Продукт» со следующей структурой (где D = Черновик и A = Одобрено)

ID   ParentID  Status  Name
---------------------------
1    NULL      A       Foo
2    1         A       Foo2
3    NULL      D       Bar
4    1         D       Foo3

Строка может быть «новой» (где ParentID == null)или может быть версией существующей строки.Таким образом, из таблицы видно, что существует 3 версии для элемента «Foo» и только 1 для «Bar».

Мне нужен способ возврата последних версий каждого элемента в зависимости от того, является ли пользовательможет видеть только «Одобренные» элементы или также может видеть «Черновик».Например,

Пользователи, которые могут видеть «D», будут иметь:

3    NULL    D
4    1       D

«Последняя» строка для «Foo» и «Bar».

Пользователи, которыеможно увидеть "А" будет иметь:

2    1       A

т.е.только «Одобренные» версии.

Заранее спасибо,

Хосе

Ответы [ 2 ]

0 голосов
/ 28 августа 2011

Вот запрос Linq, который должен работать для вас:

bool hasDraftAccess = false;

var query = DataContext.Records.AsQueryable();

if (!hasDraftAccess) {
    query = query.Where(r => r.Status == 'A');
}

var seriesQuery = query.Select(r => new { Record = r, SeriesID = r.ParentID ?? r.ID });
var latestQuery = seriesQuery.GroupBy(s => s.SeriesID).Select(g => g.OrderByDescending(s => s.Record.ID).First());
var resultsQuery = latestQuery.Select(s => s.Record);
var results = resultsQuery.ToArray();

Вот что происходит:

  1. Сначала добавьте предложение WHERE, чтобы отфильтровать черновые записи, если пользователь не имеет к ним доступа
  2. Затем добавьте псевдостолбец с именем 'SeriesID', который группирует все связанные версии в этот столбец. То есть упростить группировку родительских и связанных детей.
  3. Сгруппируйте связанные записи и затем выберите самую последнюю запись
  4. Выберите объект Linq из анонимного типа, чтобы его можно было обновлять

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

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

0 голосов
/ 28 августа 2011

Полностью не проверено - но что-то вроде этого может сработать, если я правильно понял вопрос.

Может видеть одобренный

context.Table.Where(p => p.Status == "A")

Может видеть одобренный и черновик

context.Table.Where(p => p.Status == "D" || (p.Status == "A" && !context.Table.Any(q => q.Status == "D" && q.Parent == p.Parent)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...