使用Linq重现GroupBy语句

时间:2016-01-07 11:27:36

标签: c# sql entity-framework

我正在使用.NET Framework 4.0和Entity Framework 6.1.3开发C#库。

我想获得与此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的{​​{1}}中的所有记录都具有相同的PARENT_CODE

如何重现该sql语句?

1 个答案:

答案 0 :(得分: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();