2011-04-07 50 views
0

我有一个实体映射到我的数据库中,可以使用下面的代码获得查询列表:如何对来自EF查询的结果列表进行排序?

Dim Teams As New List(Of Team) 

Teams = (From t In sdContext.Teams _ 
     Order By t.Name _ 
     Select t).ToList() 

我想要做的是参数化这个查询排序结果。有时用户会根据名称对其进行分类,有时根据说明进行分类,有时根据电子邮件地址进行分类。

我不认为我可以正确设置EF查询来排序结果,所以我正在寻找列表中的结果进行排序。我怎样才能做到这一点? EF已经具有IComparer或Predicate函数吗?

回答

1

它看起来像一个类似的问题,有人问here与此msdn article

ObjectQuery<Teams> teamsQuery = db.Teams.OrderBy("it.Name"); 
List<Teams> teams = teamsQuery.ToList(); 
+0

这个伎俩!我原来的尝试并没有从上下文中正确地拉取ObjectQuery,但使用上面的代码允许我这样做。谢谢! – 2011-04-07 16:59:27

0

您可以使用命令传递到排序依据LINQ方法的断言:

var list = sdContext.Teams.OrderBy(t => t.Name).ToList() 

或者从你原来的语句的输出以及只是为了创建列表。

+0

的引用。如果我想t.Name被一个参数传递,将相同的语法的工作? – 2011-04-07 16:02:05

+0

不要相信。 t.Name在编译时已知,因为它推断了上下文。您可以使用switch语句来确定要排序的属性。 – tomasmcguinness 2011-04-07 16:03:52

0

你可以在数据库中进行排序。我想创建一个类OrderSortCriteria

public class OrderSortDefinition{ 
    public bool ByName { get; set;} 
    public bool ByEmail { get; set; } 
    public bool ByDescription { get; set; } 
} 

建设我的查询,添加适当的排序时,我会用这个。

public IList<Team> GetSortedTeams(OrderSortDefinition sortOrder){  
    var teams = from t in sdContext.Teams 
       select t; 
    if(sortOrder.ByEmail){ 
     return teams.OrderBy(t=>t.Email).ToList(); 
    } 

    // repeat for each field. 
} 

,如果你需要支持排序多个字段你可以让你的OrderSortDefinition更加复杂。

相关问题