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