比如:
string sql="select * from table where 1=1 and name='jack'";
if(id==0)
sql=sql+" and id !=-1";
else
sql=sql+" and id in(1,2,3)";if(keyword!=null)
{
   string [] list=keyword.split(' ');
   for(int i=0;i<list.length;i++)
   {
       sql=sql+" and keyword like '%'"+list[i]+"'%'";
   }
}
如果上面的语句用linq to entity 实现 ,应该怎么写呢?

解决方案 »

  1.   

    foreach (KeyValuePair<string, object> kvp in map)
    {
      str += " and " + kvp.Key +"="+ kvp.Value;
    }
    dc.ExecuteQuery<表名>(str);
      

  2.   

    谢谢大牛。再请教下,这样相当于直接执行语句了,可以像linq to sql 那样动态查询 吗?
    还有
     public static Expression<Func<T, bool>> True<T>() { return f => true; }
            public static Expression<Func<T, bool>> False<T>() { return f => false; }        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                                Expression<Func<T, bool>> expr2)
            {
                var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
                return Expression.Lambda<Func<T, bool>>
                      (Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
            }        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                                 Expression<Func<T, bool>> expr2)
            {
                var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
                return Expression.Lambda<Func<T, bool>>
                      (Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
            } 我看网友上网有这么写的,但是我添加后会报“LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”。”;这个有办法解决吗?再次感谢。
      

  3.   

    可以的..你可以利用LINQ的延迟查询来实现 :string sql="select * from table where 1=1 and name='jack'";
    if(id==0)
    sql=sql+" and id !=-1";
    else
    sql=sql+" and id in(1,2,3)";
    ========
    var query=from t in table
              where t.name=='jack'
              select t;
    if(id==0)
    query=query.Where(t=>t.id !=-1);
    else
    query=query.Where(t=>new int[]{1,2,3}.Contains(t.id));
      

  4.   

    http://blog.csdn.net/q107770540/archive/2010/07/09/5724013.aspx
      

  5.   

    if(keyword!=null)
    {
       string [] list=keyword.split(' ');
       for(int i=0;i<list.length;i++)
       {
           sql=sql+" and keyword like '%'"+list[i]+"'%'";
       }
    }
    ========
    if(keyword!=null)
    {
      string [] list=keyword.split(' ');
      foreach(string str in keyword.split(' '))
       {
          query=query.Where(t=>t.keyword.Contains(str); 
       }
    }
      

  6.   

    大牛  这样的话 是不是相当于执行了多次的sql查询,效率比原来的一次查询低吧?
      

  7.   

    非也非也  
    你可以调试查看它们最终翻译成的SQL语句  
    你就明白了什么叫"延迟查询"了
      

  8.   


    using(var db=new MyDataEntities()){
    var q=db.MyTable.Where(t=>t.l==1&&t.name=="jack");
    if(id==0)
    q=q.Where(t=>t.id!=-1)
    else
    q=q.Where(t=>new[]{1,2,3}.Contains(t.id));
    return q.ToList();
    }这其实就是用了楼上说的延迟查询的特性