如何获取数据表中两列之间的数据?
Posted
技术标签:
【中文标题】如何获取数据表中两列之间的数据?【英文标题】:How to get data between two columns in datatable? 【发布时间】:2016-01-14 09:44:06 【问题描述】:如果我有两个这样的数据表:
1-罚则
ser from-min to-min pen
1 1 55 1
2 56 90 2
3 91 null 3
2-罚分
ser emp tot-min
1 782 2
2 672 67
3 677 92
4 56 7
我想用 LINQ 为每个用户获取笔
我的意思是tot-min
BETWEEN from-min
AND to-min
SELECT
pen
我想要具有以下结果的数据表:
emp pen
782 1
672 2
677 3
56 1
【问题讨论】:
有什么办法解决吗?如何创建一个 sql 查询does 并用它填充 DataTable?for (int i = 0; i < penaltyEmp.Rows.Count; i++) if(!string.IsNullOrEmpty(penaltyEmp.Rows[i]["tot-min"].ToString())) penaltyEmp.Rows[i]["latepen"]=penaltyrule.AsEnumerable().Where(int.Parse(penaltyEmp.Rows[i]["tot-min"].ToString())=>
如果有多个怎么办?
@TimSchmelter: multiple
什么?
@just_name: 多个匹配规则
【参考方案1】:
你可以使用这个查询:
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();
【讨论】:
【参考方案2】:这样的东西应该可以在 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 ;
【讨论】:
【参考方案3】:如果你正在使用 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()
);
【讨论】:
以上是关于如何获取数据表中两列之间的数据?的主要内容,如果未能解决你的问题,请参考以下文章