EF中c expression func<Func<T,bool>gt;动态查询怎么写

有用过System.Linq.Dynamic 进行动态LINQ文的吗_百度知道
有用过System.Linq.Dynamic 进行动态LINQ文的吗
提问者采纳
Count();$param name=&&#47, bool$T.Cast&lt.IsNullOrEmpty(modelQ;.And(p =&厦门&quot,objTableA;param name=&当前页码&lt.IsNullOrEmpty(modelQ;/param name=&return E&产品编号&amp.furniture_bargain_review_N/amp.Contains(modelQ;/初始化数据库连接字符串·结束pageCount = Counts = 0.And(p =&&}return localTable.furniture_bargain_review_DobjQueryWhere = objQueryWhere.furniture_bargain_review modelQ.furniture_bargain_review_Date_T;param&初始化数据库连接字符串·开始setConnectionString();}}}2;/ &;T.Skip((pageIndex - 1) * pageSize).Generic, bool$using S$&总页数&T&/ }public static Expression&}&#47,objTableA/AspNetPager1.FProvince!分页大小&Func&lt.Expressions.ToString();summary& 1){pageIndex = 1;using SpageCount&quot.And(p =&gt.Lambda&/modelQ&bargainId&quot.True&&gt.furniture_bargain_N pageSize.And(p =&Func&&#47.PlayingWithLinq{public static class PredicateExtensions{public static Expression&$ p!= null && modelQ;//param&return E&#47.Contains(_fcity));$ &/$gt.furniture_bargain_review_Email)){objQueryWhere = objQueryW/GridView1!string.furniture_bargain_review_Body));returns&gt.Take(intPageSize).Label1;/&}///(this Expression&&using S/&#47.Lambda&/T&gt.Invoke(expression2;param&gt,objTableA, bool$amp.furniture_bargain_review_Id, bool$$gt, expression1;/& &/&CityName&/ expression2){var invokedExpression = Expression, invokedExpression); p.furniture_bargain_review_Date_Counts&quot.FCstring _fprovince = &quot!string, invokedExpression).furniture_bargain_review_Date &lt.furniture_bargain_review_Ip.Linq!string.Contains(_fprovince)).And(p =&/&&#47, out int pageC 根据条件查询所有信息&#47, expression1;/Func&T.FT&$ p.furniture_bargain_Id.furniture_bargain_Idselect new{objTableA; pageSize + 1;/this.furniture_bargain_review_Body}), int pageS expression1; And&lt.Parameters);/&联通&&#47.Contains(modelQ;intEndRow = pageIndex * intPageSExpression&gt, bool$amp.IsNullOrEmpty(_ftype)){predicate = predicate.P True& p.Parameters);(E &&#47,objTableB; False&lt,objTableA.CityN/$}string _fcity = &Func&&#47!= null){/$ &lt,Expression&lt.L福建&quot.furniture_bargain_review_Date_end).Where(objQueryWhere)where objTableA, expression1;&#47, bool$T;pageIndex&param&&#47.IsNullOrEmpty(_fprovince)){predicate =/T&gt.Skip(intStartRow);param&&Func&namespace Www24100Net.furniture_bargain_review_Name));();summary&Func&lt.DataSource = query, bool$param name=&/&#47.furniture_bargain_review_Date);T;/}public static Expression&lt.FSimseg).Parameters.OrderBy(p =&using System.Treturns$amp.Count();/总记录数&lt.furniture_bargain_review_Name)){objQueryWhere = objQueryWhere.IsNullOrEmpty(modelQ、Linq动态查询private void bind(int pageIndex){if(pageIndex &&gt.And(p =&gt.furniture_bargain_review_Date &/评论·时间if (modelQ;var objQueryWhere = linqWhere,Expression&} sanli7337
评价(0)(0)(0)1.Cast&());T&/T;Func&lt, out int Counts){&#47.furniture_bargain_pageSize& &if (;(E评论·内容if (;&#47.Contains(_ftype));}DataClassesDataContext DBCity = new DataClassesDataContext();param name=&quot.furniture_bargain_review&T, bool$ }public static Expression&}var predicate = PredicateExtensions,SJJ;Expression&评论·名称if (.WhereM().IsNullOrEmpty(_fcity)){predicate =}&#47.furniture_bargain_Id == bargainIdjoin objTableB in objDataContext、添加类PredicateE/intStartRow = intPageSize * (pageIndex-1) ;$Func&lt.And(p =& &= modelQ;T,objTableB.furniture_bargain_review_Body.RecordCount = query.Take(pageSize),objTableA.furniture_bargain_review_Date_begin), bool$amp.furniture_bargain on objTableA;GridView1.B expression1; expression2){var invokedExpression = E}string _ftype = & &lt.C#region 生成判断条件if (modelQ ;public IQueryable GetList(int bargainId.furniture_bargain_review_Email)).Invoke(expression2;var query = DBCity!= 0){pageCount = Counts /}else{pageCount = Counts &#47.And(expression1;&T;= modelQ;$gt.DataBind().furniture_bargain_review_Body)){objQueryWhere = objQueryWhere.Body.furniture_bargain_review_Email, int pageI Or&lt.Where(predicate);param name=&quot, bool$Func&if (, expression1;SJJ;amp.furniture_bargain_review_Email.OrderByDescending(p =&&#47!= null){objQueryWhere = objQueryWhere.And(p =&if (Counts % pageSize .RecordC() { return f =&gt.True&Counts = localT())!string.LINQ;Func&评论·Emailif (.Or(expression1.Contains(modelQ; &lt.furniture_bargain_Id equals objTableB.Text = AspNetPager1.furniture_bargain_review_N() { return f =&} }#endregion 生成判断条件var localTable = (from objTableA in objDataC&;&if (;param&gt!(this Expression&&gt.csusing S条件列表&lt
网络工程师
其他类似问题
为您推荐:
linq的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁为什么用Func&object,bool&后提示 并非所有的代码路径都返回值_百度知道
为什么用Func&object,bool&后提示 并非所有的代码路径都返回值
Func& { if( a is String) return true,bool&/
//对于不是String的情况没有写返回; s= (a) =&gt,bool&gt。}所以这样才行;
else return false:Func& { if( a is String) object: return a is string你写的函数并不是对于所有情况都有返回;也可以全部直接写为;
/ s= (a) =&gt。例如
其他类似问题
为您推荐:
bool的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁[c#]从 MemberExpression 和常量创建 Func & T,bool &
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
表达式树工作足够让这个工作...
基本上想创建什么是 m.MyProperty == 1 ,在一个采用方法中使用 Func&T, bool& 。
我有 MemberExpression 已经。我试过各种各样的事情,但是不同的错误怎么也变得。
我目前有 (即不工作) 这样的事情:
object const = 1;
var equalExpression = Expression.Equal( memberExpression, Expression.Constant( const ) );
var compiled = Expression.Lambda&Func&T, bool&&( equalExpression, Expression.Parameter( typeof( T ) ).Compile();
这给了我一个异常:
到当前页面: 变量是 ' 'MyType' 从作用域引用类型的,但它没有定义
我试过重新工作的这几个不同部分,但还拿不出任何东西的工作原理。
const是一个对象,可以是任何类型,但应与相匹配的类型 MemberExpression 。
解决方案:
object c = 1;
var parameterExpression = (ParameterExpression)memberExpression.E
var equalExpression = Expression.Equal(memberExpression, Expression.Constant(c));
var compiled = Expression.Lambda&Func&T, bool&&(equalExpression, parameterExpression).Compile();
解决方法 1:
这是行不通的原因是您使用"免费常设"参数表达式编译您的 lambda 时。您应该创建 Expression.Parameter( typeof( T )) 之前制作您 memberExpression ,并使用相同的实例的 ParameterExpression 当你做出一个成员表达式时和当您正在编译 lambda 时:
var pe = Expression.Parameter( typeof( T )); // &&== Here
var memberExpression = Expression.PropertyOrField(pe /* Here */, "MyProperty");
var equalExpression = Expression.Equal( memberExpression, Expression.Constant( const ) );
var compiled = Expression.Lambda&Func&T, bool&&( equalExpression, pe ).Compile();Posts - 269,
Articles - 0,
Comments - 1983
13:34 by 破狼, ... 阅读,
&&&&&&& 在中我留下了一个问题就是PredicateExtensions。在这里很简单不需要什么多的基础只要比会And、Or逻辑运算数学知识就够了。
先贴上代码好分析:
public&static&class&PredicateExtensions&&&&{&&&&&&&&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&&&expression1,&&&&&&&&&&&&Expression&Func&T,&bool&&&expression2)&&&&&&&&{&&&&&&&&&&&&var&invokedExpression&=&Expression.Invoke(expression2,&expression1.Parameters&&&&&&&&&&&&&&&&&&&&.Cast&Expression&());&&&&&&&&&&&&return&Expression.Lambda&Func&T,&bool&&(Expression.Or(expression1.Body,&invokedExpression),&&&&&&&&&&&&expression1.Parameters);&&&&&&&&}&&&&&&&&public&static&Expression&Func&T,&bool&&&And&T&(this&Expression&Func&T,&bool&&&expression1,&&&&&&&&&&&&&&&Expression&Func&T,&bool&&&expression2)&&&&&&&&{&&&&&&&&&&&&var&invokedExpression&=&Expression.Invoke(expression2,&expression1.Parameters&&&&&&&&&&&&&&&&&.Cast&Expression&());&&&&&&&&&&&&return&Expression.Lambda&Func&T,&bool&&(Expression.And(expression1.Body,&&&&&&&&&&&&&&&&&&&&invokedExpression),&expression1.Parameters);&&&&&&&&}&&&&}
&&&&& 在其中只有四个方法,True、False、Or、And,一看大家就知道这里是对逻辑运算操作。其中True、False是对表达式进行初始化,在我没有看见这个类之前我用的是null,用null这要在没有And,Or逻辑操作时进行Null判断,如果null则返回后一个表达式。而在这里有了true,fakse这相当于初始化了一个表达式,就不用再那么麻烦了。
&&&& True、False的初始化有一个规则就是不能影响我们的正常表达式.在我们刚学语言的时候就有:逻辑与一假为假,逻辑或一真为真,那这句就可以运用于我们的这两表达式的初始化了。当我们在True、False初始化表达式和后便连接的表达式逻辑运算为And时候,我们就该用True,这么这个逻辑条件的真假取决于我们的后面表达式(逻辑与一假为假,一真那么还不确定),是不是没有影响我们的正常表达式?同理逻辑运算为Or时候,就该用False(逻辑或一真为真,一假也不确定,就取决于另一个表达式)。是不是很简单,还是那句话,我这种鼠辈估计很难想到,是应试教育禁锢了我们的思维啊!
&&&&& And、Or这是表达式逻辑运算连接,那主体为取出左边表达式body Invoke了再与右边表达式连接返回。
&&&& 为了验证我的结论,我们做几个小测试(这里为了方便改为了控制台程序):
测试1:True and连接;
public&static&void&Test1()&&&&&&&&{&&&&&&&&&&&&DbDataContext&db&=&new&DbDataContext();&&&&&&&&&&&&Expression&Func&TemplateDocument,&bool&&&expressleft&=&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PredicateExtensions.True&TemplateDocument&();&&&&&&&&&&&&expressleft&=&expressleft.And(t&=&&t.CategoriesID&&&<span style="color: #);&&&&&&&&&&&&Expression&Func&TemplateDocument,&bool&&&expressright&=&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PredicateExtensions.True&TemplateDocument&();&&&&&&&&&&&&expressright&=&expressright.And(t&=&&t.CategoriesID&&&<span style="color: #);&&&&&&&&&&expressleft=&&expressleft.Or(expressright);&&&&&&&&&&var&sql&=&db.GetCommand(db.TemplateDocument.Where(expressleft).Select(t&=&&new&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&t.TemplateID,&t.TemplateName,&t.CategoriesID&})).CommandT&&&&&&&&&&&&Console.WriteLine(sql);&&&&&&&&}
SELECT&[t0].[TemplateID],&[t0].[TemplateName],&[t0].[CategoriesID]&FROM&[dbo].[TemplateDocument]&AS&[t0]&WHERE&([t0].[CategoriesID]&&&@p0)&OR&([t0].[CategoriesID]&&&@p1)
不知你发现没有Linq表达式已经把True条件智能的去掉了,(True&&XX1)||(True&&XX2) = XX1||XX2。按照上面的说法,那我们把第一个条件改为False 的Or连接也应该一样,测试一下:测试2
public&static&void&Test2()&&&&&&&&{&&&&&&&&&&&&DbDataContext&db&=&new&DbDataContext();&&&&&&&&&&&&Expression&Func&TemplateDocument,&bool&&&expressleft&=&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PredicateExtensions.False&TemplateDocument&();//上例True该为False&&&&&&&&&&&&expressleft&=&expressleft.Or(t&=&&t.CategoriesID&&&<span style="color: #);//上例And该为Or&&&&&&&&&&&&Expression&Func&TemplateDocument,&bool&&&expressright&=&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PredicateExtensions.False&TemplateDocument&();&&&&&&&&&&&&&&&&&&&&&&&&&&//上例True该为False&&&&&&&&&&&&expressright&=&expressright.Or(t&=&&t.CategoriesID&&&<span style="color: #);&&&&&&&&&&&&&&&&&&&&&&&&&&//上例And该为Or&&&&&&&&&&&&expressleft&=&expressleft.Or(expressright);&&&&&&&&&&&&var&sql&=&db.GetCommand(db.TemplateDocument.Where(expressleft).Select(t&=&&new&{&&&&&&&&&&&&&&&&&&&&&&&&&&t.TemplateID,&t.TemplateName,&t.CategoriesID&})).CommandT&&&&&&&&&&&&Console.WriteLine(sql);&&&&&&&&}
SELECT&[t0].[TemplateID],&[t0].[TemplateName],&[t0].[CategoriesID]&FROM&[dbo].[TemplateDocument]&AS&[t0]WHERE&([t0].[CategoriesID]&&&@p0)&OR&([t0].[CategoriesID]&&&@p1)
和上例输出了sql完全一样,,(False||XX1)||(False||XX2) = XX1||XX2。那我们改变用法将True或Or连接呢?测试3:
public&static&void&Test3()&&&&&&&&{&&&&&&&&&&&&DbDataContext&db&=&new&DbDataContext();&&&&&&&&&&&&Expression&Func&TemplateDocument,&bool&&&expressleft&=&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PredicateExtensions.True&TemplateDocument&();&&&&&&&&&&&&expressleft&=&expressleft.Or(t&=&&t.CategoriesID&&&<span style="color: #);&&&&&&&&&&&&Expression&Func&TemplateDocument,&bool&&&expressright&=&&&&&&&&&&&&&&&&&PredicateExtensions.False&TemplateDocument&();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&expressright&=&expressright.Or(t&=&&t.CategoriesID&&&<span style="color: #);&&&&&&&&&&&&expressleft&=&expressleft.And(expressright);&&&&&&&&&&&&var&sql&=&db.GetCommand(db.TemplateDocument.Where(expressleft).Select(t&=&&new&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&t.TemplateID,&t.TemplateName,&t.CategoriesID&})).CommandT&&&&&&&&&&&&Console.WriteLine(sql);&&&&&&&&}
SELECT&[t0].[TemplateID],&[t0].[TemplateName],&[t0].[CategoriesID]&FROM&[dbo].[TemplateDocument]&AS&[t0]&WHERE&[t0].[CategoriesID]&&&@p0&
&恩 只有一个表达式了,当然了啊,你第一个表达式是(True||XX1)&&(False||XX2) = True&&XX2=XX2.做了这个测试,我真的很佩服微软,在代码中能够这么智能判断。索性把条件完全弄掉,我们把中间的And改为Or:(True||XX1)||(False||XX2) = True||XX2=True。这个就自己测试了你将看不到where条件了。 在中给出了一个结果总结.
& 1:构造函数使用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混合时写在AND后的OR有效 & 2:构造函数使用False时:单个AND无效,多个AND无效;单个OR有效,多个OR有效;混合时写在OR后面的AND有效
我们来验证验证:
1构造函数使用True时:
(1):单个AND有效,多个AND有效,当然了True&&XX=XX
(2):单个OR无效,多个OR无效:True || XX=True所以无效。
(3):混合时写在AND后的OR有效:(True&&XX)||XX1=XX||XX1有效,(True||XX)&&XX1=True&&XX1=XX1,肖博前辈说的无效(相对于我们需要的表达式无效,其实还是有效) (True||XX)||XX1=True||XX1=True(这里你不会看见where条件)。
2:构造函数使用False时:
&& 和True情况一样,我就不去推导了,偷个懒。
以上全是个人意见,如果有什么不对了请指导,更正。

我要回帖

更多关于 linq expression func 的文章

 

随机推荐