2009-10-27 3 views
1

번째 줄의 행 (즉, 목록 변환)의 메시지를 보내는 이유는 무엇입니까?Linq 유형 변환 문제

IEnumerable<Order> MyQuery = from order in dataContext.GetTable<Order>() 
          where order.ID == 1 
          select new Order() {ID = order.ID, OrderDate=order.OrderDate }; 

      List<Order> list = new List<Order>(MyQuery); 

메시지 :

Explicit construction of entity type 'Order' in query is not allowed. 

그것은 이미를 IEnumerable로 변환됩니다. 그것을 목록으로 변환하는 것이 무엇이 문제입니까? 나는 다음을 작성하는 경우

다시 말하지만, 그것은 작동합니다

IEnumerable<Order> MyQuery = from order in dataContext.GetTable<Order>() 
             where order.ID == 1 
             select order; 
List<Order> list = new List<Order>(MyQuery); 

이유는 무엇입니까? 트릭이란 무엇입니까?

답변

3

문제는 목록 건설에없는, 그것은이 라인이다 :

select new Order() {ID = order.ID, OrderDate=order.OrderDate }; 

문제는 명시 적으로 쿼리 내에서 엔티티를 생성 할 수 있다는 것입니다. 이 쿼리는 지연된 실행으로 인해 new List<Order> 줄에서이 줄 바꿈을 시도 할 때까지 IEnumerable이 실제로 열거되지 않았기 때문에 목록을 만들려고 할 때 발생합니다.

주문 자체를 가져 오는 것 같습니다.

IEnumerable<Order> MyQuery = from order in dataContext.GetTable<Order>() 
         where order.ID == 1 
         select order; 

는 또한, 열거을 할 이유가 없습니다, 다음 목록으로 바꿀 : 대답은 단지 순서를 선택, 그리고 새로운 질서를 구축하려고 아마. 당신은 할 수있다 :

List<Order> list = (from order in dataContext.GetTable<Order>() 
         where order.ID == 1 
         select order).ToList(); 
+0

데이터가 Order가 아닌 String 개체라고 가정합니다. 내 목록을 uint 형식으로 만들고 싶습니다 (문자열 객체를 uint로 변환). 한 단계에서이 작업을 수행 할 수 있습니까? – g33kz0r

+0

@ G33kx0r'.AsEnumerable(). 공급자가 직접이 작업을 수행 할 수 없으므로 쿼리가 끝날 때 Select (i => UInt32.Parse (i));를 선택합니다. –

2

글쎄, 당신은 정말 쿼리를 목록으로 변환 할 때 실행 중이다. 그 전에는 단지 임의의 IQueryable입니다.

  1. 은 익명 형식 사용 :

    두 가지 옵션 (당신이 다른 모든 열을 가져 오는 피하기 위해 노력하고 가정)

    var query = from order in dataContext.GetTable<Order>() 
          where order.ID == 1 
          select {ID = order.ID, OrderDate=order.OrderDate }; 
    
    var list = query.ToList(); 
    
  2. 새로운 주문을 만드는 데 사용할 AsEnumerable 후 그들은 LINQ 공급자로부터 내려 왔습니다. 그들은이 시점에서 적절한 엔티티하지 않습니다 :

    var query = dataContext.GetTable<Order>() 
            .Where(order => order.ID == 1) 
            .AsEnumerable() // Do everything else "in process" 
            .Select(order => new Order {ID = order.ID, 
                   OrderDate=order.OrderDate }); 
    
    List<Order> list = query.ToList(); 
    
+0

Jon : 옵션 1에서는 IEnumerable 에서 리스트를 만들려고하기 때문에 컴파일되지 않습니다. –

+0

죄송합니다. var (어떤 의미인지)를 사용하도록 수정합니다. –

+0

연결된 환경에서 연결이 끊어진 개체를주의해야합니다. – leppie

2

this post에 대한 첫 번째 대답은 무슨 일이 일어나고 있는지 보여줍니다.

개체에 대한 사용 패턴은이 쿼리의 외부에서 만든 및 DataContext를 통해 테이블에 삽입 한 후 나중에 쿼리에 의해 생성, 쿼리를 통해 결코 검색되지 않는 것입니다.

.ToList() 메서드를 사용하여 목록으로 변환 할 수 있습니다.