Как получить данные между двумя столбцами в datatable?
Если у меня есть две таблицы данных, как это:
1-penaltyrule
ser from-min to-min pen
1 1 55 1
2 56 90 2
3 91 null 3
2- штраф Emp
ser emp tot-min
1 782 2
2 672 67
3 677 92
4 56 7
Я хочу получить ручку для каждого пользователя с LINQ
я имею в виду где tot-min
МЕЖДУ from-min
А ТАКЖЕ to-min
ВЫБРАТЬ pen
Я хочу таблицу данных со следующим результатом:
emp pen
782 1
672 2
677 3
56 1
3 ответа
Решение
Вы можете использовать этот запрос:
var penaltyEmps = penaltyEmp.AsEnumerable()
.Select(r => new { ser = r.Field<int>("ser"), emp=r.Field<int>("emp"), tot_min=r.Field<int>("tot-min"), row = r });
var penaltyrules = penaltyrule.AsEnumerable()
.Select(r => new { ser = r.Field<int>("ser"), from_min=r.Field<int>("from-min"), to_min=r.Field<int>("to-min"), row = r });
DataTable tblResult = penaltyEmps
.Select(x => new
{
penaltyEmp = x,
matchingRules = penaltyrules.Where(x2 => x.tot_min >= x2.from_min && x.tot_min <= x2.to_min)
})
.Where(x => x.matchingRules.Any())
.Select(x => x.penaltyEmp.row)
.CopyToDataTable();
Примерно так должно работать в LINQ для вас: (Не забудьте включить пространство имен System.Linq).
var results = from emp in context.penaltyEmp
join rule in context.penaltyRule on emp.ser equals rule.ser
where emp.tot-min > rule.from-min && emp.tot-min < rule.to-min
select new { emp = emp.emp, pen = rule.pen };
Вы можете использовать это, если вы используете EF
var data=(from a in db.penaltyEmp
select new{
emp= a.emp,
pen= db.penaltyrule.Where(d=>d.from-min>a.tot-min && d.to-min==null?true:(d.to-min>a.tot-min)).Select(d=>d.pen).firstOrDefault()
});