2009-09-02 2 views
6

데이터베이스 모델 위에 모델이 있고 저장소에 개체를 매핑합니다.sql 용 linq에서 factory 클래스를 사용하는 방법?

그러나 분명히 내 GetUsers에서 "새로 선택"을할지 또는 아래에서 구현하는 것처럼 "select factoryreult"를 사용할지에 차이가 있습니다. 런타임에 CreateFromDbModel 메서드에 sql (System.NotSupportedException)에 대한 변환이 없다는 오류가 발생합니다.

이 방법이 있습니까? 어떻게 든 고칠 수 있습니까?

팩토리 메소드를 사용하고자하는 이유는 내가 어떤 의견을 ...

감사를 다른 객체를 실체화하고 한 곳에서 '매핑 코드'를 유지 할 수 있다는 것입니다, 앤더스

public IQueryable<User> GetUsers(bool includeTeams) 
    { 
     return from u in _db.sc_Players 
       where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam)) 
       select UserFactory2.CreateFromDbModel(u); 
    } 


    public static User CreateFromDbModel(sc_Player player) 
    { 
     return new User 
        { 
         Id = player.sc_PlayerID, 
         FirstName = player.FirstName.Trim(), 
         LastName = player.LastName.Trim(), 
         PresentationName = player.FirstName.Trim() + " " + player.LastName.Trim(), 
         LoginName = player.aspnet_User.LoweredUserName, 
         IsTeam = player.IsTeam, 
         Email = player.aspnet_User.aspnet_Membership.Email, 
         Password = player.aspnet_User.aspnet_Membership.Password 
        }; 
    } 

답변

1

GetUsers 메서드에서 IQueryable을 반환하기 때문에 문제가 있습니까? 대신 List를 반환하십시오. 이렇게하면 메서드 내에서 Linq 쿼리가 실행됩니다.

public List<User> GetUsers(bool includeTeams) 
{ 
    return (from u in _db.sc_Players 
    where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam)) 
    select UserFactory2.CreateFromDbModel(u)).ToList(); 
} 

이것이 문제를 해결할 수 있는지 확실하지 않습니다. Linqpad에서 로컬 데이터베이스에 수행중인 작업을 복제 할 수있었습니다. 그러나 샘플은 IQueryable을 반환하지 않았습니다. GetUsers() 외부에서 IQueryable 컬렉션을 수정하는 furthur입니까?

편집 :

내가 확인 좀 더 많은 작업을 수행했습니다. 된 IQueryable 수집이) (GetUsers를 호출 한 후 두 번째 LINQ 쿼리에 사용 그래서 내 샘플을 수정할 때 난 단지 오류를 복제 할 수 있었다 :

IQueryable<User> query = GetUsers(true); 

var q = from u in query 
    where u.Name.Contains("Bob") 
    select new {Name = u.FirstName + " " + u.LastName}; 

당신이 목록을 반환하는 경우 GetUsers에서 위의 제안 내가 내기() 오류가 사라집니다. 유일한 단점은 .ToList()를 호출 할 때 이미 쿼리를 실행했기 때문에 GetUsers()를 호출 한 후에 수행하는 모든 필터링이 데이터베이스에서 반환되는 데이터 양을 제한하지 않는다는 것입니다.

편집 2 :

불행하게도 내가 쿼리에 공장 방법을 포함하는 다른 방법이 있다고 생각하지 않습니다. 나는 한 가지 더 생각이있다. IQueryable에 대한 확장 메서드를 만들려면 ToUserList()와 같은 함수를 호출하면됩니다. ToUserList() 내부에서 쿼리에 대해 ToList()를 호출하고 사용자 컬렉션을 반환하는 팩토리 메서드를 호출합니다. Linq를 사용하여 데이터 필터링을 마쳤 으면이 메서드를 호출합니다. 이렇게하면 데이터베이스에서 데이터를로드 할 준비가되었을 때만 쿼리를 실행할 수 있습니다. 예가 아래에 나와 있습니다.

public static List<Users> ToUserList(this IQueryable<User> query) 
{ 
    return query.ToList().Select(u => UserFactory2.CreateFromDbModel(u)); 
} 

전화 같은 확장 방법이 말이

// Filter the data using linq. When you are ready to execute the query call: 
query.ToUserList(); // Query will execute and a list of User objects returned. 

희망. 더글라스 H.

+0

감사 더글라스와 Rossisdead는 나는 나의 팩토리 메소드를 호출하기 전에 목록에 변환 시도뿐만 아니라 나는 모든 LINQ를 반환해야합니까있다 개체를 데이터베이스에서 가져 오려면 모든 도메인 모델 개체를 구성해야합니다. 필요하지 않은 방법을 찾으려고했습니다. 또한 내 서비스 계층에서 필터링을 수행하고 목록을 다시 다음과 같이 변환해야합니다. 질의 가능. ... –

+0

안녕하세요 Anders, 위의 2 번 편집을 참조하십시오. – Douglas

+0

안녕하세요 더글라스, 당신의 답변을 답글로 표시 하겠지만 데이터 레이어 개체를 서비스 계층에 노출시키는 데이터 레이어에 데이터베이스 linq 개체를 유지하려고합니다. –

1

오류로 인해 거의 모두 설명됩니다.

"메서드 CreateFromDbModel에는 sql (System.NotSupportedException) "

CreateFromDbModel 메서드는 SQL 함수가 아니므로 개체가 서버에서 개체를 반환 할 때까지 응용 프로그램에서 CreateFromDbModel 함수를 실행할 수 없습니다. ToList() 또는 당신이 그들에 CreateFromDbModel를 실행하기 전에 쿼리에 비슷한.