일반 저장소를 사용하여 일부 데이터 액세스를 표준화하려고합니다. 내가 원하는 것은 내 엔터티의 기본 필드를 나타내는 인터페이스에 정의 된 함수를 가질 수 있으므로 결과를 필터링하는 데 사용할 수 있습니다. 이것은 Linq-To-SQL로 컴파일 할 수 있어야합니다.where 절에 일반 저장소 엔티티와 함께 사용하는 linq 함수
interface IEntity {
Expression<func<bool>> FilterQuery(string filter)
}
partial class AnEntity : IEntity
{
public string AName {get; set;}
Expression<func<bool>> FilterQuery(string filter)
{
return AName.Contains(filter);
}
}
class List<T> : where T : class, IEntity
{
private IQueryable<T> items;
public IQueryable<T> show(string filter)
{
items = items.Where(AN => AN.FilterQuery(filter));
return items;
}
}
그러나, 나는 일반적으로 같은 오류를 얻을 :
이 대리자 형식에 람다 식을 변환 할 수 없습니다를 '
System.Func<T,int,bool>
' 블록 의 반환 형식 중 일부는에 암시 적으로 변환하지 않기 때문에 대리자 반환 유형
내 목표를 달성하는 가장 좋은 방법은 무엇입니까? 뭔가 linq에서 SQL where 절에 사용할 수있는 엔티티에 정의 된 일반?
이것은 물건을 이동하는 이상한 방법입니다. 일반적으로 엔티티를 "필터링"하지 않으려면 리포지토리에 필터 방법을 넣거나 엔티티에 대한 강력한 유형의 콜렉션. 나는 당신이 콜렉션 내의 각 엔티티가 어떤 기준에 부합하는지 말할 방법을 제공하기를 원한다고 가정하지만, 그 엔티티 외부에 그 로직을 두어 엔티티 위에 * 작동 시키도록 할 수도있다. 실재. –
아 ... 마크 Gravell 이미 지적했다. 나는 또한 당신이 이것에 대해 갈 극한의 * 좋은 이유가 필요할 것이라고 지적하고 싶다. 대부분의 지속성 프레임 워크는 이러한 유형의 메커니즘을 제공하고 간접적 인 또 다른 계층이 큰 이익을 가져야하기 때문에 스스로를 다시 구현한다. 비용. –
안녕하세요, 모든 의견을 제공해 주셔서 감사합니다. 나는 이것이 잘못된 길로 가고 있다는 것을 알 수있다. 필자가 원하는 것은 엔터티가 필터링에 참여하는 list 메서드에 플래그를 지정하고 해당 필드를 필터링하는 것입니다. 그러나 모든 것이 일반적이기 때문에 list 메소드는 해당 필드의 이름을 알지 못합니다 (다른 엔티티 유형간에 변경됨). – stew