2009-11-13 3 views

답변

4

기본적으로 LINQ to SQL은 해당 생성자가 수행 할 작업을 알지 못합니다.이 작업을 SQL 쿼리로 변환하려고 시도하지만이를 알지 못합니다. 나중에 쿼리에 여분의 비트를 추가 할 수 있어야합니까? 그렇지 않다면, 당신은 할 수 :

public IEnumerable<ISite> GetSites() 
{ 
    return Db.Sites.Select(x => new { x.id, x.name }) // Project in SQL 
        .AsEnumerable() // Do the rest in process 
        .Select(x => new cms.bo.Site(x.id, x.name)) 
        .Cast<ISite>(); // Workaround for lack of covariance 
} 

편집 : 내가 분산 측면을 놓친하고 쿼리 실행 시간에 실패했다 가정이었다 있었다. 그것은 tvanfosson의 대답에 따라 Cast<ISite>() 그냥 전화를 시도 확실히 가치 -하지만 문제가 해결되지 않을 경우,

+0

멋진 대답을 다시 존을! – Matias

+0

@ 존, 나는이 때문에 제네릭 형식 공분산의 작동하지 않을 것입니다 : 'IEnumerable을 '에'IEnumerable을 ' –

+0

이이 IQyueryable 아닌 된 IQueryable 를 반환하지 않습니다? – tvanfosson

3

: 위의이 시도하려고 :

return Db.Sites 
      .ToList() 
      .Select(s => new cms.bo.Site(s.id, s.name)) 
      .Cast<ISite>() 
      .AsQueryable(); 
+0

AsQueryable에 대한 호출이 필요하다고 생각하지 않습니까? –

+0

지금은 VS에 액세스 할 수 없으므로 확인할 수 없지만 그렇지 않으면 IEnumerable 대신 IQableable 대신 반환하는 것이 좋습니다. Site 클래스를 만들려면 쿼리를 구체화해야하지만 메소드의 반환 유형은 변경되기 때문에 괜찮습니다. – tvanfosson

관련 문제