我正在对网格进行分层数据绑定,我需要让数据库服务器对我的对象执行排序。我可以轻松地对父集合进行排序,但我似乎无法弄清楚如何对所有子集合进行排序。我有一个模型,其中嵌套了3个子集合,并且所有这些集合都需要进行排序。
以下是我想要完成的示例模型:
public class Year
{
public int Id { get; set; }
public string Name { get; set; }
public List<Make> Makes { get; set; }
}
public class Make
{
public int Id { get; set; }
public string Name { get; set; }
public List<Model> Models { get; set; }
}
public class Model
{
public int Id { get; set; }
public string Name { get; set; }
public List<Color> Colors { get; set; }
}
public class Color
{
public int Id { get; set; }
public string Name { get; set; }
}
我正在尝试加载“年”对象列表。这里有一系列Makes,它有一系列具有颜色集合的模型。我需要根据名称属性对所有这些对象进行排序。
我试过这样做:
List<Year> years = db.Years.OrderBy("it.Name")
.Include("Makes").OrderBy("it.Name")
.Include("Makes.Models").OrderBy("it.Name")
.Include("Makes.Models.Colors").OrderBy("it.Name")
.ToList();
但是“它。”只是从...中选择的表的别名,在这种情况下是“年”。有没有办法为子表创建一个别名,所以我可以在一个查询中对它们进行排序?
答案 0 :(得分:9)
如果您需要对内部导航属性(例如模型)进行排序或过滤,那么您无法再使用Include方法加载它们。代替, 您可以像这样使用EntityCollection<TEntity>.CreateSourceQuery Method:
List years = db.Years.OrderBy("it.Name").ToList();
foreach(year in years)
{
var makesQuery = year.Makes.CreateSourceQuery().OrderBy(m => m.Name);
year.Makes.Attach(makesQuery);
foreach(make in year.Makes)
{
var modelsQuery = make.Models.CreateSourceQuery().OrderBy(m => m.Name);
make.Models.Attach(modelsQuery);
foreach(model in make.Models)
{
var colQuery = model.Colors.CreateSourceQuery().OrderBy(c => c.Name);
model.Models.Attach(colQuery);
}
}
}
这样,将构建年份对象,并对其所有导航属性进行排序。