2011-11-11 4 views
1

DB에서 회의실 목록을 가져 오는 간단한 기능이 있습니다. 다음 기능을 사용하고 있습니다 :일반 매개 변수가있는 LINQ

public List<ConferenceRoom> RunRoomQuery<T1>(T1 fieldValue, Func<ConferenceRoom, T1, bool> predicate) 
    { 
     var confRooms = _dataContext.ConferenceRooms.Where(delegate(ConferenceRoom c) 
     { 
      return predicate(c, fieldValue); 
     }); 
     return confRooms.ToList(); 
    } 

잘 작동합니다. 그러나 당신이주의했던 것처럼, 나는 "ConferenceRoom"타입을 지나가고있다. 대신에, 나는 그것이 더 일반적인하고 같이 T2를 전달하고 싶습니다 :

public List<T2> RunRoomQuery<T1,T2>(T1 fieldValue, Func<T2, T1, bool> predicate) 
    { 
     var confRooms = _dataContext.ConferenceRooms.Where(delegate(T2 c) 
     { 
      return predicate(c, fieldValue); 
     }); 
     return confRooms.ToList(); 
    } 

confRoom.ToList을() 중 하나 그것에 대해 행복하지 않다 "여기서"컴파일하지 않습니다.

질문 : 왜? 내가 왜 그럴 수 있지? 다음은 오류입니다.

error CS0305: Using the generic method 'ConferenceDB.ConferenceDb.RunRoomQuery<T1,T2>(T1, System.Func<T2,T1,bool>)' requires 2 type arguments 
C:\Projects\ConferenceDB\ConferenceDB.cs(82,25): (Related location) 
C:\Projects\ConferenceDB\ConferenceDB.cs(69,27): error CS0305: Using the generic method 'ConferenceDB.ConferenceDb.RunRoomQuery<T1,T2>(T1, System.Func<T2,T1,bool>)' requires 2 type arguments 

왜?

+0

일반적인 유형은 'ConferenceRooms' 컬렉션과 호환되어야합니다. '.ToList()'는 쿼리에서 반환 된 항목이 'T2'와 같지 않으면 작동하지 않습니다. '.Where()'가'null'을 반환하지 않도록 조심해야합니다. –

답변

1

유형의 목록이 List<T2>으로 전송 될 것으로 예상됩니다.

T2에 대한 제한이 없으면 불가능합니다.

public List<T2> RunRoomQuery<T1,T2>(T1 fieldValue, Func<T2, T1, bool> predicate) where T2 : ConferenceRoom 

는 또한 _dataContext.ConferenceRooms의 유형 IEnumerable<ConferenceRoom>, 그래서 심지어 위의 제약 조건이 작동하지 않습니다 생각한다.

왜 일반화하고 싶지는 모르겠지만 더 나은 솔루션을 제공 할 수는 없습니까?

+0

내가보다 일반화하기를 원하는 이유는 예를 들어 새로운 조건 자와 사용자 유형을 T2에 전달하여 "Admin 권한을 가진 모든 사용자"를 얻는 것과 같은 다른 모든 쿼리를 실행하려는 것입니다. 전체 LINQ와 C# 그래서 나는 약간의 도움을 사용할 수 있다고 생각 했어 .... 나는 이것들이 내가 전달하기를 원하지 않는 타입이기 때문에 제약 조건을 넣을 수 없다. 나는 일반적인 더미 타입에서 하나씩 파생 시켜서 위조 할 수있다. 그게 작동하지 않을 수도 있습니다 ... 확실하지 않습니다 –

+0

그리고 사용자가 저장되는 변수는 무엇입니까? 그것은 '_dataContext.ConferenceRooms'입니까? – Iain

+0

나는 일반화 **를 시도하고 있으며, 위의 함수가 해결하는 것보다 더 복잡해지고 있다고 생각합니다. 내가 꽤 잘하고있는 것;) 단순화하려는 코드를 추가하면 몇 가지 아이디어를 공유 할 수 있습니다. – Iain

1

_dataContext.ConferenceRoomsConferenceRoom입니다.
따라서 Where() 확장 방법은 T2이 아니라 ConferenceRoom이됩니다.


일반적인 방법의 포인트는 제네릭 – 다른 종류의 일을하는 것입니다.
ConferenceRoom s에서만 작동하므로 메서드를 일반화하는 것은 의미가 없습니다.

+0

OK 이것은 좋은 대답이었습니다 .... 여기에 내가하려는 일이 있습니다 .... 최종 사용자는 데이터 항목의 여러 유형을 쿼리합니다 ... 같은 :> 5 모든 용량의 회의실을 제공하십시오. .... 위치 '위층'이있는 모든 회의실을 나에게 ....또한 '회의실을 예약 한 모든 사용자에게 ...'등의 쿼리를 수행 할 수 있지만 컴파일 시간에 정의 된 한정된 숫자의 쿼리가 만들어집니다. 데이터를 필터링하는 적절한 predicaTe를 가진 하나의 일반적인 함수를 작성하는 것을 잊어 버릴 수 있기를 기대합니다 (아마도 게으름으로써) ... 더 나은 방법이나 약간의 방법이 있어야합니다. –

관련 문제