【向wuyq11请教】LINQ TO ENTITY 动态查询(谢谢)

haa17 2010-12-22 09:53:25
比如:


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 实现 ,应该怎么写呢?
...全文
781 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
anzaitian 2010-12-28
  • 打赏
  • 举报
回复
看来真的不可以动态查询了,诶!!!!
haa17 2010-12-23
  • 打赏
  • 举报
回复
谢谢大牛。再请教下,

这样相当于直接执行语句了,可以像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”。”;这个有办法解决吗?再次感谢。
[Quote=引用 1 楼 wuyq11 的回复:]

foreach (KeyValuePair<string, object> kvp in map)
{
str += " and " + kvp.Key +"="+ kvp.Value;
}
dc.ExecuteQuery<表名>(str);
[/Quote]
离洛 2010-12-23
  • 打赏
  • 举报
回复
膜拜高手~~~
webdiyer 2010-12-23
  • 打赏
  • 举报
回复
没注意看,原来 q107770540 的回复和我一样,汗:)
hitlcyu19 2010-12-23
  • 打赏
  • 举报
回复
哥 太羡慕你了 哈哈
[Quote=引用 4 楼 q107770540 的回复:]

可以的..你可以利用LINQ的延迟查询来实现 :
C# code

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
……
[/Quote]
webdiyer 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 haa17 的回复:]

如果上面的语句用linq to entity 实现 ,应该怎么写呢?
[/Quote]

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();
}

这其实就是用了楼上说的延迟查询的特性
q107770540 2010-12-23
  • 打赏
  • 举报
回复
非也非也
你可以调试查看它们最终翻译成的SQL语句
你就明白了什么叫"延迟查询"了
haa17 2010-12-23
  • 打赏
  • 举报
回复
大牛 这样的话 是不是相当于执行了多次的sql查询,效率比原来的一次查询低吧?
[Quote=引用 4 楼 q107770540 的回复:]

可以的..你可以利用LINQ的延迟查询来实现 :
C# code

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
……
[/Quote]
q107770540 2010-12-23
  • 打赏
  • 举报
回复
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);
}
}
q107770540 2010-12-23
  • 打赏
  • 举报
回复
可以的..你可以利用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));
yzf86211861 2010-12-23
  • 打赏
  • 举报
回复
3颗砖的 大牛
wuyq11 2010-12-22
  • 打赏
  • 举报
回复
foreach (KeyValuePair<string, object> kvp in map)
{
str += " and " + kvp.Key +"="+ kvp.Value;
}
dc.ExecuteQuery<表名>(str);

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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