本帖最后由 xuyiazl 于 2010-03-01 10:47:54 编辑

解决方案 »

  1.   

    http://www.uml.org.cn/sjjm/200904305.asp
    这里有些介绍
      

  2.   

    接个分。
    简易数据库组件:
    http://www.cnblogs.com/huxj/archive/2010/02/20/1669599.html
      

  3.   

    linq.....................
    我一直没看懂
      

  4.   

    http://developer.51cto.com/art/200909/152233.htm
    这里还有个
      

  5.   

    大哥们,是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来处理。所以
      

  6.   

    这个没有细研究过楼主去看看System.Linq.Expressions;下的expression类这个类下面有很多方法来实现动态linq to sql查询
      

  7.   

    我做的项目中用过这些,用 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分页最终解决之道
      

  8.   


    predicatebuilder是基于强类型T做的处理扩展。在我这里不适用。dynamic linq 我在用了。不过他也是处理entity的
      

  9.   

    predicatebuilder适合在多个地方组合构造同一个查询条件,dynamic linq可以把普通字符串形式的linq语句解析为linq语句执行,我不太理解你说的“他也是处理entity”是怎么回事?
      

  10.   


    错了  是 linq to sql 的 。
      

  11.   

     private void DataBind(int pageIndex, int pageSize)
            {
                //查询条件
                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 += "&nbsp;&nbsp;总记录数 " + AspNetPager1.RecordCount;
            }
       private  IEnumerable<B2B_Company> GetCompanyPaginglist(.....)

          var q=db.B2B_Company.where(obj,parm).Single();
          return q;
     
    }类似吧 代码没写全
      

  12.   

    可能是我没说明白,我使用的是DataTable对象。为什么非要使用DataTable,因为通过传递表名和其他参数过来获取表数据构造整表缓存。由于表实在是太多了,不可能手写那么多的case来进行操作,但是转换成泛型又需要强类型,可是仅仅只有object类型。所以将字典中缓存整个DataTable,用表名来作为KEY。这里就是缓存模块。查询,查询就是针对这个DataTable查询 也就是 Linq to DataTable 或者说 Linq to DataSet 再或者说 Linq to DataRow 它们和 Linq to Sql、Linq to Entity又不同.我需要的是前者的动态构造查询条件例如:var predicate = PredicateBuilder.False<DataTable>();//这里的DataTableforeach (string keyword in keywords)
                            {
                                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.@吴旗娃: 不知道是否明白了
      

  13.   


    dynamic linq不能用吗?惭愧,我没用过linq to datatable什么的,只用过linq to sql和entity framework
      

  14.   


    dynamic linq 就是 Linq to sql dynamic.  所以没办法用针对linq to datatable 等等  老外也写过少许的文章  都是针对具体已知的类型和条件了像我这种,少
      

  15.   

    楼主 就算能查,string[] items = keyword.Split('-'); 之后
    你怎么通过得到的数组 来区分哪些是"="的  哪些是"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); 
    .............
    一点愚见。混分的。。哈哈
      

  16.   

     这个foreach 循环 中where() 不行吗?predicate.Or什么作用?
      

  17.   

    DataTable dt1 = new DataTable();
      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,查寻出两个表的所有内容
    谢谢了.没分了...急啊