使用实体框架按子项

时间:2016-05-03 20:45:29

标签: c# entity-framework-6

当orderby列在父表中执行以下操作时,我调用动态排序表的行...

public List<ServiceRequest> SortSRsByParentFields(string p_Criteria, 
                                                  bool p_sortDescending,
                                                  bool p_ShowAll = true) {

    var propertyInfo = typeof(ServiceRequest).GetProperty(p_Criteria);
    var sortedList1 = new List<ServiceRequest>();
    var sortedList2 = new List<ServiceRequest>();

    var myServiceRequests = GetMyServiceRequests();
    var otherServiceRequests = GetOthersServiceRequests();

    if (p_sortDescending)
    {
      sortedList1 = myServiceRequests
        .AsEnumerable()
        .OrderByDescending(x => propertyInfo.GetValue(x, null)).ToList();

      sortedList2 = otherServiceRequests.AsEnumerable()
        .OrderByDescending(x => propertyInfo.GetValue(x, null))
        .ThenBy(x => x.Client.LastNameFirst).ToList();
    }
    else
    {
      sortedList1 = myServiceRequests.AsEnumerable()
         .OrderBy(x => propertyInfo.GetValue(x, null)).ToList();
      sortedList2 = otherServiceRequests.AsEnumerable()
         .OrderBy(x => propertyInfo.GetValue(x, null))
         .ThenBy(x => x.Client.LastNameFirst).ToList();
    }

    var allSRs = p_ShowAll == false ? sortedList1.Concat(sortedList2).Take(1000)
        .ToList() : sortedList1.Concat(sortedList2).ToList();
    return allSRs;
  }

但是,如果orderby列位于子表(通过FKey与父节点相关的表)中,我似乎无法使此方法有效。

所以问题是我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

EF并非真正考虑到动态排序。但是有一些替代方案可以用于这样的情况,而无需替换其余的EF代码。

例如,使用Tortuga Chain,您可以写:

ds.From("ServiceRequests", [filter]).WithSorting (new SortExpression(p_Criteria, p_sortDescending)).ToCollection<ServiceRequest>().Execute();

您也可以直接生成SQL,但我不推荐这种方法,因为您必须仔细检查排序表达式,以确保它实际上是列名而不是SQL注入攻击。