linq to dataset 动态查询的一个问题

dc22wt 2012-03-03 04:09:28

//这个表示选择第一个条件筛选出来的user_no
var query1 =
(from t in ds.Tables[0].AsEnumerable()
group t by t.Field<string>("user_no") into g
let fact_charge = g.Sum(p => p.Field<decimal>("fact_charge"))
where fact_charge > c
select new { user_no = g.Key }).Distinct();//Select(p=>p.Field<string>("user_no")
//这个表示选择第二个条件筛选出来的user_no
var query2 =
(from t in ds.Tables[0].AsEnumerable()
group t by t.Field<string>("user_no") into g
where g.Count() > d
select new { user_no = g.Key }).Distinct();
//这个表示选择第三个条件筛选出来的user_no
var query3 =
(from t in ds.Tables[0].AsEnumerable()
where Convert.ToInt32(t.Field<string>("gather_month")) <= b1
select new { p = t.Field<string>("user_no") }).Distinct();
客户可以随意选择这三个选项,求user_no得交集,最后将得到的user_no(暂定最后的结果为数据集query)再作为
var query4 =
from t in ds.Tables[0].AsEnumerable()
from o in query.AsEnumerable()
where o.user_no.ToString().Contains(t.Field<string>("user_no"))
orderby t.Field<string>("volpage"), t.Field<string>("user_no"), t.Field<string>("gather_month")
select t;
的查询子条件。急等各位大牛的援助。
...全文
3431 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
狂奔小蜗牛 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q107770540 的回复:]
用 Intersect 方法求交集

最后查询可这样:

C# code


var query4 =
from t in ds.Tables[0].AsEnumerable()
where query.Any(o=>o.user_no.ToString().Contains(t.Field<string>("user_no")))
orderby t.Field……
[/Quote]

O(∩_∩)O~
dc22wt 2012-03-12
  • 打赏
  • 举报
回复
不明白。。。
FelixFJ 2012-03-08
  • 打赏
  • 举报
回复
就是先根据业务需求,写要要过滤的条件函数 ,然后使用System.Linq.Expressions.Expression<Func<VisitingInfo, bool>> exp = v =>你的函数
最后在where(你的函数())
FelixFJ 2012-03-08
  • 打赏
  • 举报
回复
像这样多条件查询的,一个where是搞不定的,我给个例子你参考一下:

private bool FiltVisitor(VisitingInfo v, string visitorName, string visitorCorp, string revEmpName,
string fromVisitTime, string toVisitTime, string token)
{
bool ret = true;
if (!string.IsNullOrEmpty(visitorName))
ret &= v.VisitorName.Contains(visitorName);
if (!string.IsNullOrEmpty(visitorCorp))
ret &= v.VisitorCorp.Contains(visitorCorp);
if (!string.IsNullOrEmpty(revEmpName))
ret &= v.RevEmpName.Contains(revEmpName);
if (!string.IsNullOrEmpty(fromVisitTime))
ret &= v.VisitorComeTime >= Convert.ToDateTime(fromVisitTime);
if (!string.IsNullOrEmpty(toVisitTime))
ret &= v.VisitorComeTime <= Convert.ToDateTime(toVisitTime);
return ret;

}




System.Linq.Expressions.Expression<Func<VisitingInfo, bool>> exp = v =>
FiltVisitor(v, visitorName, visitorCorp, revEmpName, fromVisitTime, toVisitTime, token);

result.Data = this.GetVisitingInfo(fromVisitTime, toVisitTime).VisitingInfos.AsEnumerable().Where(exp.Compile());
dc22wt 2012-03-08
  • 打赏
  • 举报
回复
不好意思,我没看懂你的意识,我不知道你这个能不能实现动态查询,如果可以的话,还烦请你能否讲详细点,或者需要参考什么知识,请帮忙说下
dc22wt 2012-03-07
  • 打赏
  • 举报
回复
还有谁能帮我看看嘛
dc22wt 2012-03-06
  • 打赏
  • 举报
回复
不行哦,我是要动态查询哦,现在我自己把代码修改了下,但是还有个问题就是每个子项的延迟查询的特性没有出来,造成的效率太低,希望你能帮我再看下
var query1 =
(from t in ds.Tables[0].AsEnumerable()
where Convert.ToInt32(t.Field<string>("gather_month")) <= b1
select new { user_no = t.Field<string>("user_no") }).Distinct();
var query2 =
(from t in ds.Tables[0].AsEnumerable()
group t by t.Field<string>("user_no") into g
let fact_charge = g.Sum(p => p.Field<decimal>("fact_charge"))
where fact_charge > c
select new { user_no = g.Key }).Distinct();

var query3 =
(from t in ds.Tables[0].AsEnumerable()
group t by t.Field<string>("user_no") into g
where g.Count() > d
select new { user_no = g.Key }).Distinct();
var query4=
(from t in ds.Tables[0].AsEnumerable()
where t.Field<string>("volpage").Substring(0, 7)==f.ToString()
select new { user_no = t.Field<string>("user_no") }).Distinct();
var refer =
from t in ds.Tables[0].AsEnumerable()
.Where(x => b >= 0 ? query1.AsEnumerable().Select(p => p.user_no).Contains (x.Field<string>("user_no")) : true)
.Where(x => c >= 0 && c != 1000000000 ? query2.AsEnumerable().Select(p => p.user_no).Contains(x.Field<string>("user_no")) : true)
.Where(x => d >= 0 && d != 1000000000 ? query3.AsEnumerable().Select(p => p.user_no).Contains(x.Field<string>("user_no")) : true)
.Where(x => f != "" ? query4.AsEnumerable().Select(p => p.user_no).Contains(x.Field<string>("user_no")) : true)
.Where(x => h =="1" ? x.Field<string>("DY_flag") == "1":true)
.OrderBy(o => o.Field<string>("volpage")).OrderBy(p=>p.Field<string>("user_no")).OrderBy(q=>q.Field<string>("gather_month"))
select t;


if (refer.Count() == 0) //判断refer的记录是否为0
{
CreateColumnFooter();
CreateGroupFooter(1);
MessageBox.Show("没有符合此条件的选项,请重新输入", "信息提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);
}
else
{

DataView filter = refer.AsDataView();
this.fpSpread1_Sheet1.DataSource = filter;}
dc22wt 2012-03-06
  • 打赏
  • 举报
回复
而且我即使把distinct去掉一样不会延迟查询
dc22wt 2012-03-06
  • 打赏
  • 举报
回复
这个我知道,就是因为现在用不了他的延迟特性,所以想请问下你能有其他办法帮我解决这个问题嘛
q107770540 2012-03-06
  • 打赏
  • 举报
回复
使用了.Distinct() 还怎么可能延迟呢
q107770540 2012-03-05
  • 打赏
  • 举报
回复
用 Intersect 方法求交集

最后查询可这样:

var query4 =
from t in ds.Tables[0].AsEnumerable()
where query.Any(o=>o.user_no.ToString().Contains(t.Field<string>("user_no")))
orderby t.Field<string>("volpage"), t.Field<string>("user_no"), t.Field<string>("gather_month")
select t;

dc22wt 2012-03-04
  • 打赏
  • 举报
回复
怎么连个旁观的都没有啊,这么惨啊

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧