2016-01-07 2 views
0

Я разрабатываю библиотеку C# с .NET Framework 4.0 и Entity Framework 6.1.3.Воспроизведение оператора GroupBy с использованием Linq

Я хочу, чтобы получить тот же результат, что это SQL заявления:

select c.CODE_LEVEL 
    from CODES c 
where c.CODE in 
     (Select CODE 
      from AGGREGATION_CHILDS 
      where PARENT_CODE = N'1') 
group by c.CODE_LEVEL 

с рамкой сущности.

Я использую шаблон репозитория, и я попытался это:

List<AGGREGATION_CHILDS> childrenCodeLevel = 
       m_AggChildRepo 
        .SearchFor(a => a.PARENT_CODE == aggregation.PARENT_CODE).GroupBy(a => a.Code.CODE_LEVEL).SelectMany(a => a).ToList(); 

С помощью этого кода я получаю список AGGREGATION_CHILDS и мне нужно только CODE_LEVEL значения.

SearchFor реализация:

public IQueryable<TEntity> SearchFor(Expression<Func<TEntity, bool>> predicate) 
{ 
    return _dbSet.Where(predicate); 
} 

Это SQL-заявления создания таблицы:

CREATE TABLE [dbo].[CODES] 
(
    [CODE] [nvarchar](20) NOT NULL, 
    [CODE_LEVEL] [tinyint] NOT NULL, 
    CONSTRAINT [PK_CODES] PRIMARY KEY CLUSTERED 
    (
     [CODE] ASC 
    ) 
) 
CREATE TABLE [dbo].[AGGREGATION_CHILDS] 
(
    [CODE] [nvarchar](20) NOT NULL, 
    [PARENT_CODE] [nvarchar] (20) NOT NULL, 
    [POSITION] [int] NOT NULL, 
    CONSTRAINT [PK_AGGREGATION_CHILDS] PRIMARY KEY CLUSTERED 
    (
     [CODE] ASC 
    ), 
    CONSTRAINT [FK_AGGREGATION_CHILDS_AGGREGATIONS] FOREIGN KEY ([PARENT_CODE]) REFERENCES [AGGREGATIONS]([CODE]) ON DELETE CASCADE, 
    CONSTRAINT [FK_AGGREGATION_CHILDS_CODES] FOREIGN KEY ([CODE]) REFERENCES [CODES]([CODE]) 
) 

Все записи в AGGREGATION_CHILDS для одной и той же PARENT_CODE будут иметь один и тот же CODE_LEVEL.

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

+0

Я думаю, что это может быть яснее, как переписать, если вы измените 'ВЫБРАТЬ c.CODE_LEVEL ... GROUP BY c.CODE_LEVEL' в простой' SELECT DISTINCT c.CODE_LEVEL' без группировки. –

+0

", и я пробовал это:" ... НО ...? Что именно вы спрашиваете? Что вы пытаетесь угадать? Что не работает? – HimBromBeere

ответ

0

Поскольку вы не используете какой-либо агрегат, группа просто удалит дубликаты, аналогично использованию Distinct.

var res = db.CODES.Where(x => 
       db.AGGREGATION_CHILDS.Any(y => y.PARENT_CODE == 1 && x.Code == y.Code)) 
      .Select(x => x.CODE_LEVEL) 
      .Distinct(); 
Смежные вопросы