Wpf 如何对自引用表或实体进行排序
我有两个实体,看起来像这样Wpf 如何对自引用表或实体进行排序,wpf,entity-framework,sorting,Wpf,Entity Framework,Sorting,我有两个实体,看起来像这样 public class Post{ [Key] public int Id { get; set; } [Required(ErrorMessage = "")] [MaxLength(100, ErrorMessage = "")] public string Name { get; set; } [ForeignKey("ParentPost")]
public class Post{
[Key]
public int Id { get; set; }
[Required(ErrorMessage = "")]
[MaxLength(100, ErrorMessage = "")]
public string Name { get; set; }
[ForeignKey("ParentPost")]
public int? ParentPostId { get; set; }
public virtual Post ParentPost { get; set; }
public ICollection<Post> SubPosts { get; set; }
}
public class User{
[Key]
public int Id { get; set; }
[Required(ErrorMessage = "")]
[MaxLength(100, ErrorMessage = "")]
public string Name { get; set; }
[ForeignKey("Post")]
public int PostId { get; set; }
public virtual Post Post { get; set; }
}
按级别排序
1
2
1.1
1.2
1.1.1
更新:
这里有一个替代我之前的答案,不需要你在帖子中添加属性。为Post实体创建扩展方法,以根据Post名称计算级别和编号。我想你给它起的名字是一致的
public static class ExtensionMethods
{
public static int Level(this Post post)
{
var name = post.Name;
var level = 0;
level = name.Count(o => o == '.');
return level;
}
public static int number(this Post post)
{
var name = post.Name;
var number = 0;
var split = name.Split('.');
return split.Length > 1 ? int.Parse(split[split.Length - 1]) : int.Parse(name);
}
}
然后可以使用linq进行排序,如:
var posts = new List<Post>();
posts.Add(new Post { Name = "1.2" });
posts.Add(new Post { Name = "1.1.1" });
posts.Add(new Post { Name = "2" });
posts.Add(new Post { Name = "1.1" });
posts.Add(new Post { Name = "1" });
foreach (var post in posts)
{
Console.WriteLine(post.Name);
}
Console.WriteLine("\n\nAfter sorting");
var sorted = posts.OrderBy(p => p.Level()).ThenBy(p => p.number());
foreach (var post in sorted)
{
Console.WriteLine(post.Name);
}
谢谢,但我不想为此添加新属性。
var posts = new List<Post>();
posts.Add(new Post { Name = "1.2" });
posts.Add(new Post { Name = "1.1.1" });
posts.Add(new Post { Name = "2" });
posts.Add(new Post { Name = "1.1" });
posts.Add(new Post { Name = "1" });
foreach (var post in posts)
{
Console.WriteLine(post.Name);
}
Console.WriteLine("\n\nAfter sorting");
var sorted = posts.OrderBy(p => p.Level()).ThenBy(p => p.number());
foreach (var post in sorted)
{
Console.WriteLine(post.Name);
}
Posts.OrderBy(p => p.Level)
.ThenBy(p => p.Number);