상속 및 Dapper.net

dapper

문제

Dapper.net을 사용하기로 결정한 이유는 맵핑, 나는 별다른 생각이 필요하지 않기 때문에 데이터웨어 하우스와 객체 사이의 매핑을 처리하는 것이 지루합니다.

내 문제 :

나는이 클래스가 있다고 가정 해 봅시다.

Foo 
- ID
- Name

Bar
- FooID
- FavoriteMoovie

그리고이 테이블들 :

Foo 
- ID
- Name

Bar
- FooID
- FavoriteMoovie

그래서 나는 같은 쿼리에서 Foo와 Bars를 어떻게 선택할 수 있는지 알고 싶습니다.

지금까지 나의 유일한 생각은

  • 바가 아닌 모든 푸들을 선택하십시오
  • 그런 다음 모든 바를 선택하십시오.

"Query"메서드의 오버로드를 사용할 수 없습니다. 매핑 관계에 대해서만 있기 때문입니다.

인기 답변

계층 구조 TPH 당 하나의 테이블이있는 경우 특히 모든 하위 클래스를 쉽게 가져올 수 있습니다. 특히 BaseClass가 추상 클래스 인 경우

class Repository
{
    public IEnumerable<BaseValue> GetAll()
    {
        IEnumerable<BaseValue> values = null;

        using (SqlConnection cn = new SqlConnection(""))
        {
            cn.Open();

            const string query = "SELECT Id, TypeName, RawValue, Dimension FROM Values";

            values = cn.Query<BaseValue, object, BaseValue>(query,
                (value, ignore) =>
                {
                    BaseValue child = null;

                    if (value.TypeName == "IntValue")
                        child = new IntValue(value.Id, (int)value.RawValue, value.Dimension);
                    else if (value.TypeName == "BoolValue")
                        child = new BoolValue(value.Id, value.RawValue > 0, value.Dimension);
                    else if (value.TypeName == "FloatValue")
                        child = new FloatValue(value.Id, (float)value.RawValue, value.Dimension);
                    else if (value.TypeName == "TimeSpanValue")
                        child = new TimeSpanValue(value.Id, TimeSpan.FromSeconds(value.RawValue), value.Dimension);
                    else if (value.TypeName == "DateTimeValue")
                        child = new DateTimeValue(value.Id, new DateTime((long)value.RawValue), value.Dimension);

                    return child;
                });

            cn.Close();
        }

        return values;
    }
}

TPH 테이블에서 리포지토리 선택 :

class Repository
{
    public IEnumerable<BaseValue> GetAll()
    {
        IEnumerable<BaseValue> values = null;

        using (SqlConnection cn = new SqlConnection(""))
        {
            cn.Open();

            const string query = "SELECT Id, TypeName, RawValue, Dimension FROM Values";

            values = cn.Query<BaseValue, object, BaseValue>(query,
                (value, ignore) =>
                {
                    BaseValue child = null;

                    if (value.TypeName == "IntValue")
                        child = new IntValue(value.Id, (int)value.RawValue, value.Dimension);
                    else if (value.TypeName == "BoolValue")
                        child = new BoolValue(value.Id, value.RawValue > 0, value.Dimension);
                    else if (value.TypeName == "FloatValue")
                        child = new FloatValue(value.Id, (float)value.RawValue, value.Dimension);
                    else if (value.TypeName == "TimeSpanValue")
                        child = new TimeSpanValue(value.Id, TimeSpan.FromSeconds(value.RawValue), value.Dimension);
                    else if (value.TypeName == "DateTimeValue")
                        child = new DateTimeValue(value.Id, new DateTime((long)value.RawValue), value.Dimension);

                    return child;
                });

            cn.Close();
        }

        return values;
    }
}



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.