내 순진함에 대해 미리 사과드립니다.
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] 삭제
몇 마디 만하겠습니다