为此目的,我实现了ESQL查询(仅找到此解决方案):
var queryEsql = string.Format(@" select VALUE ent from SomeEntitIEs as ent join Attributes as ea ON ea.EntityID = ent.ID where ea.AttributeTypeID = @typeID order by ea.{0} {1}",columnname,descending ? "desc" : "asc");var query = ObjectContext.createquery<SomeEntity>(queryEsql,new ObjectParameter("typeID",attributeTypeID));
表格具有以下结构:
<Attribute>: int ID; decimal DecimalColumn; string StringColumn; int EntityID; int AttributeTypeID;<SomeEntity>: int ID; string name;
使用liNQ to EntitIEs方法有没有办法重写这些东西(排序)?
解决方法 这是我的尝试,我不能保证它会起作用.我需要更多地考虑如何获得动态列名,我不确定那个.编辑:您可以使用字符串作为订单列.int typeID = 1115;bool orderAscending = false;string columnname = "StringColumn";var query = from ent in SomeEntitIEsjoin ea in Attributes on ea.EntityID = ent.IDwhere ea.AttributeTypeID = typeID;if(orderAscending){ query = query.OrderBy(ea => columnname).Select(ea => ea.Value);}else{ query = query.OrderByDescending(ea => columnname).Select(ea => ea.Value);}
var results = query.ToList(); //调用toList或枚举来执行查询,因为liNQ已延迟执行.
编辑:我认为选择停止后的排序是从订购.我将select语句移到了order by之后.我还添加了“query =”,但我不确定是否需要.我目前没办法测试这个.
编辑3:我今天解雇了LINQPad并对我之前的情况进行了一些调整.我使用EF为代码优先方法建模您的数据,它应该接近您所拥有的数据.
如果您只是想获取属性列表(您不是),这种方法会更好.为了解决这个问题,我在MyAttribute类中添加了一个Entity属性.
此代码适用于liNQPAD.
voID Main(){ // add test entitIEs as needed. I'm assuming you have an Attibutes collection on your Entity based on your tables. List<MyEntity> SomeEntitIEs = new List<MyEntity>(); MyEntity e1 = new MyEntity(); MyAttribute a1 = new MyAttribute(){ StringColumn="One",DecimalColumn=25.6M,ID=1,EntityID=1,AttributeTypeID = 1,Entity=e1 }; e1.Attributes.Add(a1); e1.ID = 1; e1.name= "E1"; SomeEntitIEs.Add(e1); MyEntity e2 = new MyEntity(); MyAttribute a2 = new MyAttribute(){ StringColumn="Two",DecimalColumn=198.7M,ID=2,EntityID=2,Entity=e2 }; e2.Attributes.Add(a2); e2.ID = 2; e2.name = "E2"; SomeEntitIEs.Add(e2); MyEntity e3 = new MyEntity(); MyAttribute a3 = new MyAttribute(){ StringColumn="Three",DecimalColumn=65.9M,ID=3,EntityID=3,Entity=e3 }; e3.Attributes.Add(a3); e3.ID = 3; e3.name = "E3"; SomeEntitIEs.Add(e3); List<MyAttribute> attributes = new List<MyAttribute>(); attributes.Add(a1); attributes.Add(a2); attributes.Add(a3); int typeID = 1; bool orderAscending = true; string columnname = "StringColumn"; var query = (from ent in SomeEntitIEs where ent.Attributes.Any(a => a.AttributeTypeID == typeID) select ent.Attributes).SelectMany(a => a).Asqueryable(); query.Dump("Pre Ordering"); if(orderAscending) { // query = is needed query = query.OrderBy(att => MyEntity.GetPropertyValue(att,columnname)); } else { query = query.OrderByDescending(att => MyEntity.GetPropertyValue(att,columnname)); } // returns a List of MyAttributes. If you need to get a List of attributes,add a MyEntity property to the MyAttribute class and populate it var results = query.Select(att => att.Entity).ToList().Dump();}// define other methods and classes here} class MyAttribute { public int ID { get; set; } public decimal DecimalColumn { get; set; } public string StringColumn { get; set; } public int EntityID { get; set; } public int AttributeTypeID { get; set; } // having this property will require an Include in EF to return it then query,which is less effecIEnt than the original Objectquery< for the question public MyEntity Entity { get; set; } } class MyEntity { public int ID { get; set; } public string name { get; set; } public ICollection<MyAttribute> Attributes { get; set; } public MyEntity() { this.Attributes = new List<MyAttribute>(); } // this Could have been on any class,I stuck it here for ease of use in liNQPad // caution reflection may be slow public static object GetPropertyValue(object obj,string property){// from Kjetil Watnedal on https://stackoverflow.com/questions/41244/dynamic-linq-orderby System.Reflection.PropertyInfo propertyInfo=obj.GetType().GetProperty(property); return propertyInfo.GetValue(obj,null);}总结
以上是内存溢出为你收集整理的entity-framework – 将ESQL转换为LINQ to Entities.按相关实体排序全部内容,希望文章能够帮你解决entity-framework – 将ESQL转换为LINQ to Entities.按相关实体排序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)