大哥们,是linq to datatable or linq to dataset or linq to datarow数据对象是 datatable or dataset or datarow 如果是linq to sql 那就简单多了 面向的是entity但是目前的问题是面向table的。获取字段只能用dt.Columns[ColumnsName]来获取如query.Where(item => item[itemName].ToString().Contains(itemValue));但是构造多条件而且是动态条件就比较麻烦了如果是entity动态多条件就好多了而且我目前做的是查询缓存 缓存字典中是datatable,根据表名作为字典key来操作,如果用反射处理,那一切都是object ,因为需要强类型T 所以没办法处理成List来处理。所以
这个没有细研究过楼主去看看System.Linq.Expressions;下的expression类这个类下面有很多方法来实现动态linq to sql查询
我做的项目中用过这些,用 dynamic linq http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx再加这个 predicate builder http://www.albahari.com/nutshell/predicatebuilder.aspx构建动态查询非常方便====================================================================== ASP.NET WebForm和ASP.NET MVC分页最终解决之道
这里有些介绍
简易数据库组件:
http://www.cnblogs.com/huxj/archive/2010/02/20/1669599.html
我一直没看懂
这里还有个
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx再加这个 predicate builder
http://www.albahari.com/nutshell/predicatebuilder.aspx构建动态查询非常方便======================================================================
ASP.NET WebForm和ASP.NET MVC分页最终解决之道
predicatebuilder是基于强类型T做的处理扩展。在我这里不适用。dynamic linq 我在用了。不过他也是处理entity的
错了 是 linq to sql 的 。
{
//查询条件
StringBuilder sb = new StringBuilder();
ArrayList list = new ArrayList();
int i = 0;
int count = 0;
if (txtCode.Text.Trim() != string.Empty)
{
sb.Append("Code.Contains(@").Append(i.ToString()).Append(")");
list.Add(txtCode.Text.Trim());
i++;
}
if (txtName.Text.Trim() != string.Empty)
{
if (i > 0) sb.Append(" and ");
sb.Append("Name.Contains(@").Append(i.ToString()).Append(")");
list.Add(txtName.Text.Trim());
i++;
}
if (ddlCriditClass.SelectedValue != "-1")
{
if (i > 0) sb.Append(" and ");
sb.Append("CriditClass == @").Append(i.ToString());
list.Add(int.Parse(ddlCriditClass.SelectedValue));
i++;
}
if (ddlVIP.SelectedValue != "-1")
{
if (i > 0) sb.Append(" and ");
sb.Append("VIPClass == @").Append(i.ToString());
list.Add(int.Parse(ddlVIP.SelectedValue));
i++;
}
object[] obj = null;
int parmsCount = list.Count;
if (parmsCount > 0)
{
obj = new object[parmsCount];
for (int j = 0; j < parmsCount; j++)
{
obj[j] = new object();
obj[j] = list[j];
}
} //执行分页
IEnumerable<B2B_Company> companys = order.GetCompanyPaginglist(sb.ToString(), obj, pageIndex, pageSize, ref count);
gv.DataSource = companys;
gv.DataBind(); //分页
AspNetPager1.CurrentPageIndex = pageIndex;
AspNetPager1.RecordCount = count;
AspNetPager1.PageSize = pageSize;
AspNetPager1.CustomInfoHTML = "Page <font color=\"red\"><b>" + pageIndex + "</b></font> of " + AspNetPager1.PageCount;
AspNetPager1.CustomInfoHTML += " 总记录数 " + AspNetPager1.RecordCount;
}
private IEnumerable<B2B_Company> GetCompanyPaginglist(.....)
{
var q=db.B2B_Company.where(obj,parm).Single();
return q;
}类似吧 代码没写全
{
if (!String.IsNullOrEmpty(keyword))
{
string[] items = keyword.Split('-');
string itemName = items[0];
string itemValue = items[1]; predicate = predicate.Or(p => p.Columns[itemValue].ToString().Contains(itemValue));//这里能取到字段吗? }
}
}
//所以并不能使用类型T的操作方法。
//下面的构造条件表达式,不管Expression.Parameter(dt.GetType(), "c")中的dt.GetType()是什么 都无法获取到字段。。
ParameterExpression c = Expression.Parameter(dt.GetType(), "c");
Expression condition = Expression.Constant(false);
Expression con = Expression.Call(
Expression.Field(c, itemName),//这里
typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),
Expression.Constant(itemValue));
condition = Expression.Or(con, condition);
//同样使用Dynamic linqquery.Where("ID == 100000");//这里仍然找不到字段 ERROR: DataRow中找不到字段ID.@吴旗娃: 不知道是否明白了
dynamic linq不能用吗?惭愧,我没用过linq to datatable什么的,只用过linq to sql和entity framework
dynamic linq 就是 Linq to sql dynamic. 所以没办法用针对linq to datatable 等等 老外也写过少许的文章 都是针对具体已知的类型和条件了像我这种,少
你怎么通过得到的数组 来区分哪些是"="的 哪些是"like" 的? 再去判断case items[0]=="xxx"这样?我有个想法 假设你开始的参数是这样的: http://.../..aspx?参数名="姓名-王二|年龄-15|地址-湖北"
改成这样带多个参数的 把可能的参数全部带上http://.../..aspx?姓名="王二"&年龄="15"地址="湖北"//绝对匹配
var relust = _query.Where(姓名!=""?item =>item[姓名].ToString() ==姓名:true); //like模糊查询
var relust = _query.Where(地址!=""?item =>item[地址].ToString().Contains(地址):true);
.............
一点愚见。混分的。。哈哈
dt1.Columns.Add("c1");
dt1.Columns.Add("c2");
DataRow dr1 = dt1.NewRow();
dr1["c1"] = "a";
dr1["c2"] = "ad";
dt1.Rows.Add(dr1); DataTable dt2 = new DataTable();
dt2.Columns.Add("c3");
dt2.Columns.Add("c4");
DataRow dr2 = dt2.NewRow();
dr2["c3"] = "a";
dr2["c4"] = "b";
DataRow dr3 = dt2.NewRow();
dr3["c3"] = "a";
dr3["c4"] = "c"; dt2.Rows.Add(dr2);
dt2.Rows.Add(dr3);也就是相当于内联接,根据第一个表的c1等于第二个表的c3,查寻出两个表的所有内容
谢谢了.没分了...急啊