public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }

    internal Lazy<List<Post>> lazyPosts { get; set; }
    public List<Post> Posts => lazyPosts.Value;

}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int UserId { get; set; }
}

Fake service. Ce serait plutôt un service qui interrogerait une base de données (sinon on pourrait utiliser le mot clé yield + IEnumerable pour diminuer le nombre d’appels selon les requêtes Linq).

public class DataService
{
    static List<Post> posts = new List<Post>
    {
        new Post{ Id =1, Title="Post 1", Content = "Content 1", UserId=1},
        new Post{ Id =2, Title="Post 2", Content = "Content 2", UserId=1},
        new Post{ Id =3, Title="Post 3", Content = "Content 3", UserId=2},
        new Post{ Id =4, Title="Post 4", Content = "Content 4", UserId=2},
        new Post{ Id =5, Title="Post 5", Content = "Content 5", UserId=2}
    };

    static List<User> users = new List<User>
    {
        new User{ Id =1, UserName = "Marie", lazyPosts = new Lazy<List<Post>>(()=> GetPostsByUser(1)) },
        new User{ Id =2, UserName = "Pat" , lazyPosts = new Lazy<List<Post>>(()=> GetPostsByUser(2)) },
    };

    public static User GetUser(int id)
    {
        // select * from users where id=@id
        return users.FirstOrDefault(u => u.Id == id);
    }

    public static List<Post> GetPostsByUser(int userId)
    {
        // select * from posts where id=@user_id
        return posts.Where(p => p.UserId == userId).ToList();
    }
}

On charge simplement l’object

var user = DataService.GetUser(2);

Les posts sont évalués qu’à la « demande ». Par exemple si l’on bind la liste dans la page ou si l’on essaie d’accéder à la liste.

var posts = user.Posts;

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *