2009-07-09 4 views
1

내가 함께 벽에 머리를 두드리는있어 확인이 하나 ;-)음속 3 Linq에 투사 문제

주소, 고객 및 CustomerType라는 내 데이터베이스에

감안할 때 테이블, 나는 고객에 대한 통합 요약 정보를 표시 할 그래서이 두 테이블을 조인하고 지정된 결과를 검색하는 쿼리를 작성합니다.

var customers = (from c in tblCustomer.All() 
         join address in tblAddress.All() on c.Address equals address.AddressId 
         join type in tblCustomerType.All() on c.CustomerType equals type.CustomerTypeId 
         select new CustomerSummaryView 
            { 
             CustomerName = c.CustomerName, 
             CustomerType = type.Description, 
             Postcode = address.Postcode 
            }); 

    return View(customers); 

CustomerSummaryView 간단한 POCO 어떤 이유로 지금

public class CustomerSummaryView 
{ 
    public string Postcode { get; set; } 
    public string CustomerType { get; set; } 
    public string CustomerName { get; set; } 
} 

, 이것이 내가 CustomerSummaryView 결과를 IEnumerable 목록을 작동하지 않습니다이며, 각 레코드는 고객 이름과 우편 번호 만있다 고객 유형 필드는 항상 null입니다.

다른 데이터베이스 테이블과 예상되는 클래스를 사용하여이 문제를 여러 번 재현했습니다.

누구나 아이디어가 있으십니까?

답변

2

나는이 문제를 repro 수 없습니다 - 여기 난 그냥 시도 테스트입니다 : 이것은 완벽하게 통과

[Fact] 
public void Joined_Projection_Should_Return_All_Values() { 
    var qry = (from c in _db.Customers 
        join order in _db.Orders on c.CustomerID equals order.CustomerID 
        join details in _db.OrderDetails on order.OrderID equals details.OrderID 
        join products in _db.Products on details.ProductID equals products.ProductID 
        select new CustomerSummaryView 
        { 
         CustomerID = c.CustomerID, 
         OrderID = order.OrderID, 
         ProductName = products.ProductName 
        }); 

    Assert.True(qry.Count() > 0); 

    foreach (var view in qry) { 
     Assert.False(String.IsNullOrEmpty(view.ProductName)); 
     Assert.True(view.OrderID > 0); 
     Assert.False(String.IsNullOrEmpty(view.CustomerID)); 
    } 

} 

. 예약어를 사용하고 계신지 궁금합니다.

이 게시물 유사한 문제를 참조 할 것
+0

안녕하세요 롭, 매핑이 정확하게 일치하므로 테스트가 통과했다고 생각합니다. Jon은 CustomerType = type.Description을 처리하고 있으며,이 문제 만이 문제가있는 유일한 속성입니다. 나는 매우 비슷한 무언가를 만났습니다. http://stackoverflow.com/questions/1734146/subsonic-3-linq-projecting-anonymous-types-but-not-class-types –

0

존의 원래 예 사이의 차이를 가지고있는 반면 그의 투사의 속성 이름이 정확히 일치하기 때문에 예, 롭의 예는 작동하는 이유는 CustomerType 및 type.Description.

이것은 문제가 아니었지만, Projection Mapper가 동일한 이름의 속성을 찾고 일치하지 않는 값을 매핑하지 않았습니다. 따라서 정확히 일치하는 이름이 없으면 투영 객체의 속성은 해당 유형의 기본값이됩니다.

좋은 소식은 오늘 최신 소스를 얻었으며 새로운 Subsonic.Core.dll을 빌드했고 동작이 수정되었습니다.

위의 John 코드는 예상대로 작동해야합니다.

0

방금이 스레드의 마지막 포스터에서 약 2 개월 후인 2010 년 3 월 21 일부터 최신 빌드를 다운로드했으며 패키지 이진 파일에 문제가 여전히 존재합니다. 파머.

 var data = 
      (from m in Metric.All() 
      where m.ParentMetricId == parentId 
      select new 
        { 
         m.MetricName, 
         m.MetricId, 
        }) 
        .ToList(); 

     var treeData = 
      from d in data 
      select new TreeViewItem 
        { 
         Text = d.MetricName, 
         Value = d.MetricId.ToString(), 
         LoadOnDemand = true, 
         Enabled = true, 
        }; 

     return new JsonResult { Data = treeData }; 

나는 음속 쿼리에서 직접 투사를 수행하려고 할 경우이의 텍스트 속성은 ID와 종료되고 속성이 끝 : 나는 무엇을해야 여기

이름. 아주 이상한.