Sql 如何根据列值选择行?

Sql 如何根据列值选择行?,sql,sql-server,linq,linq-to-sql,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

我有以下资料:

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 NULL 1 1 1 2 NULL NULL 2 1 NULL 3 1 活动: 用户标识活动ClassId 1 1空 空1 1 1 2空 空2 1 空3 1
如果您不关心在本例中返回哪条记录,那么执行一个简单的FirstOrDefault()将返回这两条记录中的第一条记录

var result = activity.Where(a => a.UserId == userId || a.ClassId == classId).FirstOrDefault();
如果您更喜欢先返回非空UserId的记录,并且在一行代码中,您可以按该列降序排序,然后获得第一个或默认值:

var result = activity.Where(a => a.UserId == userId || a.ClassId == classId).OrderByDescending(a => a.UserId).FirstOrDefault()
编辑: 为了获得“预期结果”中的结果,我们希望首先按用户ID降序排序,然后按活动分组,然后选择组中的第一个。因为我们最初进行了排序,所以第一个始终是填充了UserId的活动,除非不存在:

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

如果您不关心在本例中返回哪条记录,那么执行一个简单的FirstOrDefault()将返回这两条记录中的第一条记录

var result = activity.Where(a => a.UserId == userId || a.ClassId == classId).FirstOrDefault();
如果您更喜欢先返回非空UserId的记录,并且在一行代码中,您可以按该列降序排序,然后获得第一个或默认值:

var result = activity.Where(a => a.UserId == userId || a.ClassId == classId).OrderByDescending(a => a.UserId).FirstOrDefault()
编辑: 为了获得“预期结果”中的结果,我们希望首先按用户ID降序排序,然后按活动分组,然后选择组中的第一个。因为我们最初进行了排序,所以第一个始终是填充了UserId的活动,除非不存在:

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

这不起作用,因为你的userid和classid都有或筛选为或,所以两个都有记录。这不起作用,因为你的userid和classid都有或筛选为或,所以两个都有记录。他们需要所有的活动作为预期的结果。@furqanms我已经更新了我的答案来说明这一点,请查看它是否符合你的预期。否,这是行不通的。我需要所有活动,如果用户定义了活动,您所做的条件将从类返回活动。在这种情况下,我不需要classI中的活动,我需要所有活动作为预期结果。@furqanms我已更新了我的答案以说明这一点,请查看它是否符合您的预期。不,它将不起作用。我需要所有活动,如果用户定义了活动,您所做的条件将从类返回活动。在这种情况下,我不需要课堂上的活动