LINQ 查询,用于按顺序返回下一项



LINQ 的新手并卡住了。我有一系列步骤。 每个步骤都有一个唯一的 ID、单个步骤分配给谁的 ID 和一个序列 (0-7)。 我正在尝试传入步骤的唯一 ID,但返回分配给下一步的人员的 ID。 我当前的查询如下所示(我知道这是错误的,只是想说明:

var nextApproverId = _context.ApprovalSteps
.Where(p => p.Header.Active == true &&
p.Sequence == (p.Sequence== (step.sequence + 1))
.Select(p => p.AssignedApproverId);

步骤如下所示

Id      AssignedApproverId      Sequence
123           100                  0
438           101                  1

所以我试图传入 Id 123,目的是返回 Id 438。

var currentId = 123;
var nextApproverId = _context.ApprovalSteps.Single(s => s.sequence == _context.ApprovalSteps.Single(p => p.id == currentId).sequence + 1).Id;
//Returns 438 in your example

创建 2 个查询:

一个获取当前序列:

var currentSequence = _context.ApprovalSteps.Single(p => p.id == currentId).sequence;

另一个使用 currentSequence 获取下一步:

var nextStep = context.ApprovalSteps.Single(s => s.sequence == _currentSequence + 1);

nextStep.Id 获取该步骤的 ID。

合并:

var nextApproverId = _context.ApprovalSteps.Single(s => s.sequence == _context.ApprovalSteps.Single(p => p.id == currentId).sequence + 1).Id;

你的问题就在这里:

p.Sequence == (p.Sequence== (step.sequence + 1))

这部分应该是

var nextApproverId = _context.ApprovalSteps
.Where(p => p.Header.Active == true &&
p.Sequence == (step.sequence + 1))
.Select(p => p.AssignedApproverId);

这是可能的答案,请参阅此处的输出

steps.Select(x =>steps.IndexOf(tags.Where(ele => ele.m_id == id).FirstOrDefault()) + 1).FirstOrDefault();

创建了一个具有我自己的类结构的示例,如 OP 所述,具有唯一 ID 的人员类。 要解决此问题,需要找到当前 Id 的索引in My case Index of 3 is 1然后遍历列表,查看当前对象索引是否比用户在此处提供的索引少 1In my case the index of output which is "2" is 2 so 2-1 == index of the Id provided as argument by OP

class person
{
public string m_name;
public int m_id;
public person(string name,int id)
{
m_name = name;
m_id = id;
}
}

主类

List<person> steps= new List<person>();
steps.Add(new person("sample",1));
steps.Add(new person("sample1",3));
steps.Add(new person("sample2",2));
int id = 3;
int sample = steps.Where(x => steps.IndexOf(x) - 1 == (steps.IndexOf(steps.Where(ele => ele.m_id == id).FirstOrDefault()))).Select(x => x.m_id).FirstOrDefault();
int sample2 =  steps.Select(x =>steps.IndexOf(steps.Where(ele => ele.m_id == id).FirstOrDefault()) + 1).FirstOrDefault();
// output is 2 

最新更新