Sql을 사용하면 하나의 쿼리 내에서 하위 개체를 어떻게 수화시킬 수 있습니까?

c# dapper entity-framework sql tsql

문제

나는 Dapper를 사용하고 있지만 이것이 일반적인 SQL에 적용된다고 생각합니다 :

나는 다음과 같은 것을 가지고있다.

 var dapperQuery = "select * from ( select * from [User] where " +
                                  "AccountDisabled <> 1 and " +
                                  "Rate <= @maxRate and " +
                                  "(datediff(day, Birthdate, @today) / 365) between @minage and @maxage";

 // some conditional stuff

 dapperQuery = dapperQuery + " order by LastOnline desc offset @skip rows fetch next 40 rows only ) As [Limit1] " +
                              "LEFT OUTER JOIN Photo AS [Extent2] ON [Limit1].[UserId] = [Extent2].[UserId]";

 var dbProfiles = connection.Query<User>(dapperQuery, new {
                    maxRate = query.SearchMaxRate,
                    userPoint = "POINT (" + user.LocationLong + " " + user.LocationLat + ")",
                    searchRadius = radius,
                    today = DateTime.UtcNow,
                    minAge = query.SearchLowerAge,
                    maxAge = query.SearchUpperAge,
                    skip = query.Index * 40
                }).ToList();

이제, 예상 한 결과가 반환되지만 User.Photos 속성은 항상 비어 있습니다. 쿼리 내에서 이것을 수화하는 방법은 무엇입니까?

내 사용자 클래스 :

[Table("User")]
public class User {

    public User() {
        Photos = new List<Photo>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string Username { get; set; }

    public DateTime Birthdate { get; set; }
    [Index("LastOnlineIndex")]
    public DateTime LastOnline { get; set; }

    public string NumberConfirmationCode { get; set; }

    public int Rate { get; set; }

    public int SearchRadius { get; set; }
    public int SearchLowerAge { get; set; }
    public int SearchUpperAge { get; set; }
    public int SearchMaxRate { get; set; }

    public bool AccountDisabled { get; set; }

    public virtual ICollection<Photo> Photos { get; set; }

}

내 사진 수업 :

public class Photo {

    public Photo() {}

    [Key]
    public int PhotoId { get; set; }
    public string Url { get; set; }
    public bool IsProfilePhoto { get; set; }

    [ForeignKey("User")]
    public int UserId { get; set; }
    public virtual User User { get; set; }

}
 public class PhotoConfiguration : EntityTypeConfiguration<Photo> {
    public PhotoConfiguration() {
        // One-to-Many
        HasRequired(s => s.User).WithMany(s => s.Photos).HasForeignKey(s => s.UserId);
    }
}

수락 된 답변

우선, 엔티티를 가져 오는 데 Dapper.NET을 사용하는 경우 왜 Entity Framework 유창 구성을 게시했는지 확신 할 수 없습니다.

엔티티를 일대 다 관련 엔티티와 함께 ​​가져 오려면 https://github.com/StackExchange/dapper-dot-net 에서 Dapper.NET 추가 정보를 확인하십시오 . 이 readme의 다음 예제는 사례에 적용 가능해야합니다.

var sql = 
@"select * from #Posts p 
left join #Users u on u.Id = p.OwnerId 
Order by p.Id";

var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post;});

UserPosts 모음을 가지고 있으며 가져온 연결을 사용하여 해당 모음을 채우려한다고 가정합니다. 이것을 달성하기 위해 Linq to Objects를 사용할 수 있습니다 :

var users = data.GroupBy(p => p.Owner.Id).Select(g =>
{
    var user = g.First().Owner;
    user.Posts = g.ToList();
    return user;
 });


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow