2009-06-22 4 views
1

이 주어진 :LinqToSQL - 런타임에 IQueryable 객체를 캐스팅 하시겠습니까?

"T"는 메서드에 전달하는 일반 엔티티입니다
var query = context.GetTable<T>(); 

,

나는 이런 식으로 뭔가 할 싶습니다

:

if(typeof(TEntity) is IEntitySoftDeletable) 
    query = query.Cast<IEntitySoftDeletable>.Where(ent => !ent.IsDeleted); 
} 

이것이 가능을?

현재이 방법을 사용할 수 없다고 말하고 있습니다.

매개 변수 "T"를 클래스 또는 메서드 수준에서 IEntitySoftDeletable로 설정할 수 있다는 것을 알고 있지만이를 피하고 같은 방법으로 더 많은 유연성을 제공하려고합니다.

+0

T는 IEntitySoftDeletable을 구현합니까? – bytebender

+0

항상 그렇지는 않습니다 ... T는 IEntitySoftDeletable을 구현하는 몇 가지 유형이 될 수 있습니다. 내가 원하는 것은 * T *가 IEntitySoftDeletable 인 쿼리 가능 *에 술어를 추가하는 것입니다. 내가 피하려고하는 것은이 분리 동작에 과부하가 필요하다는 것입니다. –

답변

0

나는 당신이 원하는 것을 이해하지만 이것이 효과가 있을지 확신하지 못합니까?

query.OfType<IEntitySoftDeletable>().Where(ent => !ent.IsDeleted); //OfType will only give the ones that are IEntitySoftDelteable 
+0

같은 문제가 있습니다. "T"를 "IEntitySoftDeletable"로 변환 할 수 없다고 말합니다. "T"를 받아들이는 클래스가 있습니다. 여기서 T는 contstraint가 없습니다. 그래서 "T"유형의 쿼리 가능을 얻었을 때 IEntityQueryable이 아니지만 "있을 수도"있습니다. 내가하고 싶은 일은 런타임시 검사하고, 그렇다면 IsDeleted의 값을 확인하는 것입니다. 이 메서드를 사용하면 IsDeleted를 확인할 수 있지만 쿼리 가능 형식을 "T"에서 "IEntitySoftDeletable"으로 캐스팅 할 수 없습니다. 나는 망쳐 버리고 기본적으로 과부하에 대한 제약을 두어야한다고 생각합니다. –

+0

오, 미안, 나는 두뇌 방구했다. 당신의 방법이 효과가 있습니다. 나는 단지 같은 쿼리 변수 "duh"로 반환 할 수 없다. 새 쿼리를 선언해야합니다. –

0

당신은 그냥하는 System.Reflection에 사용 추가 확인 ...

obj.GetType().GetInterface("IEntitySoftDelete") == null 

내가 그 당신이 필요로하는 무엇을 위해 일한다고 생각합니다 사용하여 인터페이스를 테스트 할 수 있습니다.

+0

obj가 IEntitySoftDeletable인지 확인하는 데 문제가 없습니다. IQueryable 에 IQueryable 을 전송하는 데 문제가 있습니다. 내가 할 수있는 유일한 방법은 "T"를 클래스 또는 메서드 수준에서 IEntitySoftDeletable로 제한하는 것입니다. –

관련 문제