Dapper 컴플렉스 매핑 Dapper.Extensions Dapper.FluentMap

c# dapper dapper-extensions dapper-fluentmap

문제

나는 내 코드에 약간의 문제가있어 멋지게 잘 놀 수있다.

내 코드를 말할 때 상속 된 것이므로 내 디자인이 아닙니다.

데이터베이스에 대한 호출이 효율적이지 않아서 Dapper가 명백한 선택처럼 보였던 SQL을보다 잘 제어하고 싶었 기 때문에 Entity Framework를 대체하려고합니다.

내가 겪고있는 문제는 내가 가지고있는 poco 클래스를 dapper 멀티 쿼리에 매핑하는 데 어려움을 겪고 있다는 것이다.

내가 가진 문제는 다음과 같습니다.

    public Feed GetFeedDapper(int feedId)
        {
            Feed feed = null;

            var sql =
            @"
            SELECT * FROM Feeds WHERE FeedId= @FeedId
            SELECT * FROM FeedFilterParameters WHERE FeedId = @FeedId
            SELECT * FROM TeamFeeds WHERE FeedId = @FeedId";

            using (var multi = DbConnection.QueryMultiple(sql, new { FeedId = feedId }))
            {
                feed = multi.Read<Feed>().Single();
                feed.Parameters = multi.Read<FeedFilterParameter>().ToList();
                feed.TeamFeeds = multi.Read<TeamFeed>().ToList();
            } 

            return feed;
        }

이것은 나에게 데이터베이스에서 올바른 결과를 얻고있다. 문제는 피드 객체의 모든 속성이 매핑되지 않는다는 것이다. 피드에는 아래에 표시된 InboundProperties 유형의 InboundProperties라는 특성이 있으며, 데이터베이스에서 InboundProperties_ {PropName}로 저장됩니다. 이 속성은 매핑되지 않으며 DapperExtensions 또는 FluentMap에서 아무것도 시도하지 않습니다.

public class InboundProperties
{
    public string ExternalRef { get; set; }
    public string ExternalRefPrevious { get; set; }
    public string ExternalId { get; set; }
    public string ExternalName { get; set; }
    public string ExternalToken { get; set; }
    public int ExternalAPICounts { get; set; }
    public string ExternalLink { get; set; }
    public string ExternalPicture { get; set; }
    public string LastProcessedMessageId { get; set; }
    public long? LastProcessedMessageTime { get; set; }
    public DateTime? MessageCountStartDT { get; set; }
    public Int32 TenancyId { get; set; }
    public virtual int FeedScopeInt { get; set; }
}

아무도 날 이러한 속성을지도 도움이 될 수 있습니까 ??

수락 된 답변

당신은 그렇게 sth 시도 :

Feed feed = null;

var sql =
@"
SELECT * FROM Feeds WHERE FeedId= @FeedId
SELECT InboundProperties_ExternalRef as ExternalRef, InboundProperties_ExternalRefPrevious as ExternalRefPrevious FROM Feeds as InboundProperties WHERE FeedId= @FeedId
SELECT * FROM FeedFilterParameters WHERE FeedId = @FeedId
SELECT * FROM TeamFeeds WHERE FeedId = @FeedId";

using (var multi = DbConnection.QueryMultiple(sql, new { FeedId = feedId }))
{
    feed = multi.Read<Feed>().Single();
    feed.InboundProperties = multi.Read<InboundProperties>().Single();
    feed.Parameters = multi.Read<FeedFilterParameter>().ToList();
    feed.TeamFeeds = multi.Read<TeamFeed>().ToList();
} 

return feed;

단 2 개의 첫 번째 속성 만 매핑했지만 작동하면 모든 속성을 매핑하는 방법을 알 수 있습니다.


인기 답변

이것이 내가 해결 한 방법이지만 #rraszewski 대답도 받아 들여지지 만, 모든 선택을 매우 수동으로 처리해야한다는 것을 의미합니다.

public Feed GetFeedDapper(int feedId)
{
    Feed feed = null;

    var multiPredicate = new GetMultiplePredicate();
    multiPredicate.Add<Feed>(Predicates.Field<Feed>(x => x.FeedId, Operator.Eq, feedId));
    multiPredicate.Add<InboundProperties>(Predicates.Field<InboundProperties>(x => x.FeedId, Operator.Eq, feedId));
    multiPredicate.Add<OutboundProperties>(Predicates.Field<OutboundProperties>(x => x.FeedId, Operator.Eq, feedId));
    multiPredicate.Add<FeedFilterParameter>(Predicates.Field<FeedFilterParameter>(x => x.FeedId, Operator.Eq, feedId));
    multiPredicate.Add<TeamFeed>(Predicates.Field<TeamFeed>(x => x.FeedId, Operator.Eq, feedId));

    var result = DbConnection.GetMultiple(multiPredicate);

    feed = result.Read<Feed>().Single();
    feed.InboundProperties = result.Read<InboundProperties>().Single();
    feed.OutboundProperties = result.Read<OutboundProperties>().Single();
    feed.Parameters = result.Read<FeedFilterParameter>().ToList();
    feed.TeamFeeds = result.Read<TeamFeed>().ToList();

    return feed;
}

그런 다음 클래스를 매핑합니다.

public class FeedMapper : ClassMapper<Feed>
{
    public FeedMapper()
    {
        base.Table("Feeds");
        Map(f => f.FeedId).Key(KeyType.Identity);

        Map(f => f.Owner).Ignore();
        Map(f => f.TeamFeeds).Ignore();
        Map(f => f.FeedDirection).Ignore();
        Map(f => f.InboundProperties).Ignore();
        Map(f => f.Parameters).Ignore();
        Map(f => f.OutboundProperties).Ignore();
        Map(f => f.RelatedTeams).Ignore();

        AutoMap();
    }
}

public class InboundPropertiesMapper : ClassMapper<InboundProperties>
{
    public InboundPropertiesMapper()
    {
        base.Table("Feeds");
        Map(f => f.FeedId).Key(KeyType.Identity);

        Map(f => f.Channel).Ignore();
        Map(f => f.FeedScope).Ignore();

        Map(f => f.ChannelInt).Column("InboundProperties_ChannelInt");
        Map(f => f.ExternalAPICounts).Column("InboundProperties_ExternalAPICounts");
        Map(f => f.ExternalId).Column("InboundProperties_ExternalId");
        Map(f => f.ExternalLink).Column("InboundProperties_ExternalLink");
        Map(f => f.ExternalName).Column("InboundProperties_ExternalName");
        Map(f => f.ExternalPicture).Column("InboundProperties_ExternalPicture");
        Map(f => f.ExternalRef).Column("InboundProperties_ExternalRef");
        Map(f => f.ExternalRefPrevious).Column("InboundProperties_ExternalRefPrevious");
        Map(f => f.ExternalToken).Column("InboundProperties_ExternalToken");
        Map(f => f.FeedScopeInt).Column("InboundProperties_FeedScopeInt");
        Map(f => f.LastProcessedMessageId).Column("InboundProperties_LastProcessedMessageId");
        Map(f => f.LastProcessedMessageTime).Column("InboundProperties_LastProcessedMessageTime");
        Map(f => f.MessageCountStartDT).Column("InboundProperties_MessageCountStartDT");
        Map(f => f.TenancyId).Column("InboundProperties_TenancyId");
        AutoMap();
    }
}

public class OutboundPropertiesMapper : ClassMapper<OutboundProperties>
{
    public OutboundPropertiesMapper()
    {
        base.Table("Feeds");
        Map(f => f.FeedId).Key(KeyType.Identity);

        Map(f => f.Channel).Ignore();
        Map(f => f.FeedType).Ignore();

        Map(f => f.OutboundFeedTypeInt).Column("OutboundProperties_OutboundFeedTypeInt");
        Map(f => f.TenancyId).Column("OutboundProperties_TenancyId");
        AutoMap();
    }
}


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