日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

EntityFramework4.5使用Expression类创建动态查询及动态查询导航属性

發(fā)布時(shí)間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EntityFramework4.5使用Expression类创建动态查询及动态查询导航属性 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

創(chuàng)建動(dòng)態(tài)查詢


想在項(xiàng)目中實(shí)現(xiàn)一個(gè)靈活的動(dòng)態(tài)查詢類,參考http://www.cnblogs.com/lyj/archive/2008/03/25/1122157.html和http://www.cnblogs.com/killuakun/archive/2008/08/03/1259389.html后寫(xiě)了一段Demo,發(fā)現(xiàn)代碼在VS2012 EF4.5中會(huì)拋如下異常:



相同的代碼在VS2008 EF3.5中是可以正常運(yùn)行的:




糾結(jié)萬(wàn)分后找到解決方法,代碼如下:


[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);?
  • //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";?
  • 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";



    動(dòng)態(tài)查詢導(dǎo)航屬性


    實(shí)體關(guān)系如圖:



    如何拼接出 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")); //先得到導(dǎo)航屬性Province?
  • ??????????? Expression leftproperty = Expression.Property(left, "Name"); //再得到Province.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";?
  • ?
  • 網(wǎng)上的中文資料很少,我對(duì)著Expression.Property方法琢磨了老半天才整明白,寫(xiě)在這方便大家吧。?
  • ?
  • 執(zhí)行結(jié)果:?
  • 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")); //先得到導(dǎo)航屬性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";網(wǎng)上的中文資料很少,我對(duì)著Expression.Property方法琢磨了老半天才整明白,寫(xiě)在這方便大家吧。執(zhí)行結(jié)果:


    再貼上自己項(xiàng)目中用的方法

    [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);


    轉(zhuǎn)載于:https://www.cnblogs.com/swarb/archive/2012/10/22/9924379.html

    總結(jié)

    以上是生活随笔為你收集整理的EntityFramework4.5使用Expression类创建动态查询及动态查询导航属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。