創建動態查詢
想在項目中實現一個靈活的動態查詢類,參考http://www.cnblogs.com/lyj/archive/2008/03/25/1122157.html和http://www.cnblogs.com/killuakun/archive/2008/08/03/1259389.html后寫了一段Demo,發現代碼在VS2012 EF4.5中會拋如下異常:
相同的代碼在VS2008 EF3.5中是可以正常運行的:
糾結萬分后找到解決方法,代碼如下:
[csharp] view plaincopyprint?
OscarEntities db = new OscarEntities();? IQueryable<City> cities = db.Citys;? ParameterExpression param = Expression.Parameter(typeof(City), "c");? Expression left = Expression.Property(param, typeof(City).GetProperty("Name"));? Expression right = Expression.Constant("北京市");? Expression filter = Expression.Equal(left, right);? ? ? ? ? var result = db.Citys.Where(Expression.Lambda<Func<City, bool>>(filter, param));? list.DataSource = result.ToList();? list.DisplayMember = "Name";? OscarEntities db = new OscarEntities();IQueryable<City> cities = db.Citys;ParameterExpression param = Expression.Parameter(typeof(City), "c");Expression left = Expression.Property(param, typeof(City).GetProperty("Name"));Expression right = Expression.Constant("北京市");Expression filter = Expression.Equal(left, right);//Expression pred = Expression.Lambda(filter, param);//Expression expr = Expression.Call(typeof(Queryable), "Where", new Type[] { typeof(City) },// Expression.Constant(cities), pred);//var result = db.Citys.AsQueryable().Provider.CreateQuery<City>(expr);var result = db.Citys.Where(Expression.Lambda<Func<City, bool>>(filter, param));list.DataSource = result.ToList();list.DisplayMember = "Name";
動態查詢導航屬性
實體關系如圖:
如何拼接出 db.Citys.Where(x => x.Province.Name == "湖南省") 呢?,代碼如下:
[csharp] view plaincopyprint?
??????????? OscarEntities db = new OscarEntities();? ??????????? IQueryable<City> cities = db.Citys;? ??????????? ParameterExpression param = Expression.Parameter(typeof(City), "c");? ??????????? Expression left = Expression.Property(param, typeof(City).GetProperty("Province")); ? ??????????? Expression leftproperty = Expression.Property(left, "Name"); ? ??????????? Expression right = Expression.Constant("湖南省");? ??????????? Expression filter = Expression.Equal(leftproperty, right);? ??????????? var result = db.Citys.Where(Expression.Lambda<Func<City, bool>>(filter, param));? ??????????? list.DataSource = result.ToList();? ??????????? list.DisplayMember = "Name";? ? 網上的中文資料很少,我對著Expression.Property方法琢磨了老半天才整明白,寫在這方便大家吧。? ? 執行結果:? OscarEntities db = new OscarEntities();IQueryable<City> cities = db.Citys;ParameterExpression param = Expression.Parameter(typeof(City), "c");Expression left = Expression.Property(param, typeof(City).GetProperty("Province")); //先得到導航屬性ProvinceExpression leftproperty = Expression.Property(left, "Name"); //再得到Province.NameExpression right = Expression.Constant("湖南省");Expression filter = Expression.Equal(leftproperty, right);var result = db.Citys.Where(Expression.Lambda<Func<City, bool>>(filter, param));list.DataSource = result.ToList();list.DisplayMember = "Name";網上的中文資料很少,我對著Expression.Property方法琢磨了老半天才整明白,寫在這方便大家吧。執行結果:
再貼上自己項目中用的方法
[csharp] view plaincopyprint?
public Expression GetProperty(Expression source, ParameterExpression para, string Name)? {? ??? string[] propertys = Name.Split('.');? ??? if (source == null)? ??? {? ??????? source = Expression.Property(para, typeof(City).GetProperty(propertys.First()));? ??? }? ??? else source = Expression.Property(source, propertys.First());? ??? foreach (var item in propertys.Skip(1))? ??? {? ??????? source = GetProperty(source , para, item);? ??? }? ??? return source;? }? public Expression GetProperty(Expression source, ParameterExpression para, string Name){string[] propertys = Name.Split('.');if (source == null){source = Expression.Property(para, typeof(City).GetProperty(propertys.First()));}else source = Expression.Property(source, propertys.First());foreach (var item in propertys.Skip(1)){source = GetProperty(source , para, item);}return source;}
使用方法:
[csharp] view plaincopyprint?
ParameterExpression param = Expression.Parameter(typeof(City), "x");? Expression left = GetProperty(null, param, "Province.Name"); ? Expression right = Expression.Constant("湖南省");? Expression filter = Expression.Equal(left,right);? ParameterExpression param = Expression.Parameter(typeof(City), "x");Expression left = GetProperty(null, param, "Province.Name"); //得到查詢條件屬性Expression right = Expression.Constant("湖南省");Expression filter = Expression.Equal(left,right);
轉載于:https://www.cnblogs.com/swarb/archive/2012/10/22/9924379.html
總結
以上是生活随笔為你收集整理的EntityFramework4.5使用Expression类创建动态查询及动态查询导航属性的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。