我有以下数据:
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
答案 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();
}
};
}
}