LINQ 쿼리의 기본 클래스에 확장 메서드 사용

JCaddy

내 순진함에 대해 미리 사과드립니다.

Entity Framework를 사용하여 도메인 모델에 정의한 엔터티를 유지하고 있습니다. 내 도메인 모델 엔티티는 모두 내 EntityBase 클래스에서 상속됩니다. 여기에는 모든 엔터티에 공통적으로 적용하려는 속성이 있습니다.

public class EntityBase
{
    public string CreatedBy { get; set; }
    public DateTime? Created { get; set; }

    public int ModifiedBy { get; set; }
    public DateTime? Modified { get; set; }

    public bool Enabled { get; set; }
    public bool Deleted { get; set; }
}

이제 LINQ를 사용하여 EF를 쿼리 할 때 특정 엔터티가 활성화되었는지 또는 삭제되었는지 확인하기 위해 요소를 포함 할 필요가 없으면 좋을 것입니다. 모든 쿼리에는 코드가 포함됩니다. 예를 들면 다음과 같습니다.

var messages = _db.Memberships.Where(m => m.UserId.Equals(userId))
                              .SelectMany(m => m.Group.Messages)
                              .Include(m => m.Group.Category)
                              .Select(m => m.Enabled && !m.Deleted) 
                              .ToList();

매번이 작업을 수행하는 대신 IQueryable에서 작동하는 확장 메서드를 작성할 것이라고 생각했습니다.

public static IQueryable<EntityBase> Active(this IQueryable<EntityBase> entityCollection)
    {
        return entityCollection.Where(e => e.Enabled && !e.Deleted);
    }

순진하게 나는 EntityBase 클래스에서 상속하는 엔터티를 반환하는 모든 LINQ 쿼리에 이것을 포함시킬 수 있다고 생각했습니다.

var messages = _db.Memberships.Where(m => m.UserId.Equals(userId))
            .SelectMany(m => m.Group.Messages)
            .Include(m => m.Group.Category)
            .Active() <============================= Extension Methd
            .ToList();

        return Mapper.Map<List<Message>,List<MessageDto>>(messages);

그러나 컴파일러는 이제 다음과 같이 불평합니다.

Error 2 Argument 1: cannot convert from
          'System.Collections.Generic.List<Diffusr.Business.Entities.EntityBase>' to
          'System.Collections.Generic.List<Diffusr.Business.Entities.Message>'  

질문 : 원하는 것을 달성 할 수 있습니까? 즉, 모든 엔터티가 삭제되지 않고 활성화 됨 만 반환하는 공통 방법을 사용할 수 있습니까? 그렇다면 어떻게?

파나지오티스 카나 보스

구체적인 클래스를 지정하는 대신 대부분의 확장 메서드가 수행하는 것처럼 제네릭을 사용합니다.

public static IQueryable<T> Active<T>(this IQueryable<T> entityCollection) where T:EntityBase
{
    return entityCollection.Where(e => e.Enabled && !e.Deleted);
}

4.0 이전의 .NET 버전을 사용하고 있다고 가정합니다. 4.0 이전에는 일반 공분산 이 허용되지 않았습니다 (즉, 기본 유형의 열거 형이 예상 될 때 자식 유형의 열거 형 전달).

4.0 이후에도 컴파일러가 새로운 값을 List에 저장하려고 할 때마다 형식 안전성을 보장하기 위해 많은 추가 검사를 수행하므로 공분산을 사용하는 것이 절대적인 최선의 생각은 아닙니다. Jon Skeet에 대한 좋은 기사가 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

자식 클래스에서 기본 클래스의 확장 메서드 호출

분류에서Dev

XText의 기존 클래스에 확장 메서드 추가

분류에서Dev

활동에서 확장되는 다른 클래스의 메서드 사용

분류에서Dev

ZF2 Autoloader : 확장 클래스의 기본 클래스에도 팩토리 사용

분류에서Dev

Base 클래스의 배열에서 Subclass 메서드의 기본값 사용

분류에서Dev

기본 클래스에서 파생 클래스의 다형성 확장

분류에서Dev

확장 클래스에서 사용자 관리자 가져 오기

분류에서Dev

Moq를 사용하여 대리자 매개 변수를 사용하는 기본 클래스에서 메서드 호출 확인

분류에서Dev

C #의 기본 클래스에서 제네릭 사용 : 기본 클래스의 메서드가 파생 클래스의 형식을 반환하는지 확인하는 방법은 무엇입니까?

분류에서Dev

사용자 정의 클래스를 기본 메소드에서 parametrizedthreadstart 클래스로 전달

분류에서Dev

C의 postgres 확장에서 원본 SQL 쿼리 가져 오기

분류에서Dev

기존 C # 클래스의 확장 된 '사본'만들기

분류에서Dev

C #에서 매개 변수를 사용하여 기본 클래스 메서드 숨기기 / 재정의

분류에서Dev

정적 기본 메서드에서 클래스 사용

분류에서Dev

LINQ 쿼리의 정수 필드에 대한 유사 메서드

분류에서Dev

PHP의 확장 클래스에서 정적 함수 사용

분류에서Dev

파생 클래스의 기본 클래스에서 변수 재사용 : Scala

분류에서Dev

다른 클래스의 기본 클래스에서 개체 사용

분류에서Dev

'확장'클래스 대신 팩토리 함수에서 스프레드 사용

분류에서Dev

LINQ 쿼리의 이상한 확장 메서드 동작

분류에서Dev

LINQ 쿼리의 이상한 확장 메서드 동작

분류에서Dev

친구 하위 클래스의 기본에서 개인 메서드 사용-NVCC의 컴파일러 버그?

분류에서Dev

기본 클래스에서 typedef 사용 및 재정의

분류에서Dev

C #은 기본 클래스에서 새 재정의 된 메서드를 사용하지 않습니다.

분류에서Dev

react-native를 사용하여 프로젝트를 만들 때 '기본 클래스 앱 확장 Component <Props>'에서 <Props>는 무엇을 의미합니까?

분류에서Dev

systemverilog에서 $ cast를 사용하여 기본 클래스에서 파생 클래스의 메서드에 액세스 할 수 있습니까?

분류에서Dev

서비스를 사용하는 기본 클래스를 확장하는 Grails 도메인 단위 테스트

분류에서Dev

확장 클래스에서 메인 클래스의 메서드를 사용하고 생성자 루프를 피하는 방법

분류에서Dev

mapreduce의 기본 정렬은 WritableComparable 클래스 또는 comapreTo () 메서드에 정의 된 Comparator를 사용합니까?

Related 관련 기사

  1. 1

    자식 클래스에서 기본 클래스의 확장 메서드 호출

  2. 2

    XText의 기존 클래스에 확장 메서드 추가

  3. 3

    활동에서 확장되는 다른 클래스의 메서드 사용

  4. 4

    ZF2 Autoloader : 확장 클래스의 기본 클래스에도 팩토리 사용

  5. 5

    Base 클래스의 배열에서 Subclass 메서드의 기본값 사용

  6. 6

    기본 클래스에서 파생 클래스의 다형성 확장

  7. 7

    확장 클래스에서 사용자 관리자 가져 오기

  8. 8

    Moq를 사용하여 대리자 매개 변수를 사용하는 기본 클래스에서 메서드 호출 확인

  9. 9

    C #의 기본 클래스에서 제네릭 사용 : 기본 클래스의 메서드가 파생 클래스의 형식을 반환하는지 확인하는 방법은 무엇입니까?

  10. 10

    사용자 정의 클래스를 기본 메소드에서 parametrizedthreadstart 클래스로 전달

  11. 11

    C의 postgres 확장에서 원본 SQL 쿼리 가져 오기

  12. 12

    기존 C # 클래스의 확장 된 '사본'만들기

  13. 13

    C #에서 매개 변수를 사용하여 기본 클래스 메서드 숨기기 / 재정의

  14. 14

    정적 기본 메서드에서 클래스 사용

  15. 15

    LINQ 쿼리의 정수 필드에 대한 유사 메서드

  16. 16

    PHP의 확장 클래스에서 정적 함수 사용

  17. 17

    파생 클래스의 기본 클래스에서 변수 재사용 : Scala

  18. 18

    다른 클래스의 기본 클래스에서 개체 사용

  19. 19

    '확장'클래스 대신 팩토리 함수에서 스프레드 사용

  20. 20

    LINQ 쿼리의 이상한 확장 메서드 동작

  21. 21

    LINQ 쿼리의 이상한 확장 메서드 동작

  22. 22

    친구 하위 클래스의 기본에서 개인 메서드 사용-NVCC의 컴파일러 버그?

  23. 23

    기본 클래스에서 typedef 사용 및 재정의

  24. 24

    C #은 기본 클래스에서 새 재정의 된 메서드를 사용하지 않습니다.

  25. 25

    react-native를 사용하여 프로젝트를 만들 때 '기본 클래스 앱 확장 Component <Props>'에서 <Props>는 무엇을 의미합니까?

  26. 26

    systemverilog에서 $ cast를 사용하여 기본 클래스에서 파생 클래스의 메서드에 액세스 할 수 있습니까?

  27. 27

    서비스를 사용하는 기본 클래스를 확장하는 Grails 도메인 단위 테스트

  28. 28

    확장 클래스에서 메인 클래스의 메서드를 사용하고 생성자 루프를 피하는 방법

  29. 29

    mapreduce의 기본 정렬은 WritableComparable 클래스 또는 comapreTo () 메서드에 정의 된 Comparator를 사용합니까?

뜨겁다태그

보관