2015-04-20 28 views
2

我想通过Linq中的记录获取组中存在记录的结果。 我有在SQL查询,但我在努力得到它在LINQ如何检查记录存在于按linq分组的子查询中sql

在SQL查询

select LEVEL, DESCR 
    from ACTIVITY_LKUP 
    WHERE LEVEL IN (//Checking row exists 
    select TOP 2 b.LEVEL 
    from ACTIVITY_LKUP b 
    WHERE b.LEVEL > (
    select max(b.LEVEL) 
    from ACTIVITY a, ACTIVITY_LKUP b 
    WHERE b.TYPE = a.ACTIVITY_TYPE 
    and a.JOB_CANDIDATE_ID = 1 
    ) 
    group by b.level //Grouping here 
) 
order by LEVEL 

在LINQ查询

var duplicate =(from lkup in ACTIVITY_LKUP 
       where lkup.LEVEL== (from actlk in ACTIVITY_LKUP //Iam Not able to check row exists in the group by 
       where actlk.LEVEL > 
       (
       from act in ACTIVITY 
       join lkup in ACTIVITY_LKUP on act.ACTIVITY_TYPE equals lkup.TYPE 
       where act.JOB_CANDIDATE_ID == 1 
       orderby lkup.LEVEL 
       select lkup.LEVEL 
       ).First()    
       group actlk by actlk.LEVEL into lggrp 
       select new { LEVEL = lggrp.Key,DESCR=lggrp.Select(x=>x.DESCR)    
       }).Take(2) 
      select lkup) 

显示错误行“操作员“ =='不能应用于'int?'类型的操作数和“System.Linq.IQueryable”。

我们如何在LINQ中做到这一点?帮助我的人。

+0

它看起来像lkup.LEVEL是'int?'或可为空而用于比较的价值回报是一个集合或'IQueryable '这在您使用''Take(2)'时会有意义,在这种情况下将返回长度为2的IQueryable 。您可以尝试更改将(2)改为.FirstOrDefault()。 – CalebB

+1

另外[这里](http://stackoverflow.com/questions/1024559/when-to-use-first-and-when-to-use-firstordefault-with-linq)是一个很好的问题,它描述了First()/ FirstOrDefault()和Take(int)的返回值。 – CalebB

回答

0

你也可以试着在查询中加入相等列,像

var duplicate=(from lg in reslandentity.ACTIVITY_LKUP 
       join grp in 
        (from actlk in reslandentity.ACTIVITY_LKUP 
        where actlk.LEVEL > 
        (
         from act in reslandentity.ACTIVITY 
         join lkup in reslandentity.ACTIVITY_LKUP on act.ACTIVITY_TYPE equals lkup.TYPE 
         where act.JOB_CANDIDATE_ID == 1 
         orderby lkup.LEVEL 
         select lkup.LEVEL 
        ).FirstOrDefault() 
         orderby actlk.LEVEL 
         group actlk by actlk.LEVEL into lggrp 
         select new { LEVEL = lggrp.Key }).Take(2) 
       on lg.LEVEL equals grp.LEVEL 
       select lg).ToList(); 

希望它可以帮助你.. !!

-1

我认为你需要在你的查询中放置字段类型。你可以尝试像这个查询。

var duplicate= from myRow in dt.AsEnumerable() 
       where myRow.Field<DateTime>("Con_Date").Date <= StartDate && myRow.Field<DateTime>("Con_Date").Date >= EndDate 
          select myRow;