如何根据列值选择行?

时间:2016-04-02 04:22:13

标签: sql sql-server linq linq-to-sql

我有以下数据:

Activity :

UserId  Activity    ClassId
1       1           NULL        
NULL    1           1
1       2           NULL
NULL    2           1   
NULL    3           1 

预期结果:

Activity :

UserId  Activity    ClassId
1       1           NULL        
1       2           NULL
NULL    3           1 

我正在尝试选择用户记录,如果它不存在则需要从类中选择:

 var userId = 1;
 var classId = 1;
 var result = activity.where(a=> a.UserId == userId || a.ClassId == classId).select(a=> a).ToList();

结果不正确:

Activity :

UserId  Activity    ClassId
1       1           NULL        
NULL    1           1
1       2           NULL
NULL    2           1   
NULL    3           1 

1 个答案:

答案 0 :(得分:0)

如果你不关心在这种情况下返回哪条记录,那么做一个简单的FirstOrDefault()将返回两条记录的第一条记录。

var result = activity.Where(a => a.UserId == userId || a.ClassId == classId).OrderByDescending(a => a.UserId).FirstOrDefault()

如果您更喜欢首先返回非空UserId的记录,并且在一行代码中,您可以按该列降序排序,然后获取第一个或默认值:

var result = activity.Where(a => a.UserId != null ? a.UserId == userId : a.ClassId == classId).OrderByDescending(a => a.UserId).FirstOrDefault()

修改 为了使它们符合预期结果',我们希望首先按UserId降序排序,然后按活动分组,然后选择组中的第一个。因为我们最初排序,所以第一个将始终是填充了UserId的活动,除非不存在:

public class DataflowSpec {
    public static Specification<Dataflow> search(final String[] group, final String[] sort, final String[] desc) {
        return new Specification<Dataflow>() {
            @Override
            public Predicate toPredicate(Root<Dataflow> root1, CriteriaQuery<?> query1, CriteriaBuilder builder) {
                // TODO Auto-generated method stub

                CriteriaQuery<Tuple> query = builder.createQuery(Tuple.class);

                Root<Dataflow> root = query.from(Dataflow.class);


                query.multiselect(root.get("srcip"), root.get("dstip"), builder.count(root));

                query.groupBy(root.get("srcip"), root.get("dstip"));

                query.orderBy(builder.desc(root.get("srcip").as(BigInteger.class)));
                return query.getRestriction();
            }
        };
    }
}