entity-framework – 将ESQL转换为LINQ to Entities.按相关实体排序

entity-framework – 将ESQL转换为LINQ to Entities.按相关实体排序,第1张

概述我正在使用EF RIA,不幸的是遇到了相关实体排序的一些问题. 为此目的,我实现了ESQL查询(仅找到此解决方案): var queryESQL = string.Format(@" select VALUE ent from SomeEntities as ent join Attributes as ea ON ea.EntityId = ent.Id where ea.At 我正在使用EF RIA,不幸的是遇到了相关实体排序的一些问题.
为此目的,我实现了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.按相关实体排序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1007447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存