1

ASP.NET 페이지에서 asp : ListView 컨트롤이 있습니다. 이 방법 설정 인 EntityDataSource에 바인딩 : 두 테이블, SOrder 및 주소가 SQL 서버에서asp 정렬 : EntityDataSource에 바인딩 된 ListView

<asp:EntityDataSource ID="EntityDataSourceOrders" runat="server" 
     ConnectionString="name=EntitiesContext" 
     DefaultContainerName="EntitiesContext" EntitySetName="SOrder" 
     Include="Address" 
     EnableDelete="True" EnableInsert="True" 
     EnableUpdate="True"> 
</asp:EntityDataSource> 

. SOrder에는 Address 테이블에 대한 외부 키 AddressID가 있습니다 ("주문에는 하나의 주소가 있음"). 주소에는 영숫자 필드 "Name1"이 있습니다. 나는이 버튼을 클릭하면 내가 "저를 알리는 EntitySqlException을 얻을

<asp:LinkButton runat="server" ID="SortButtonName" Text="Name" 
       CommandName="Sort" CommandArgument="Address.Name1" /> 

: ListView에의 LayoutTemplate에서

는 순서의 주소의 이름 1하여 목록에서 순서를 정렬 할 수있는 링크 버튼입니다 'Address.Name1'을 (를) 현재 컨텍스트에서 확인할 수 없습니다. " 내가 다른 테이블에서 관련 분야를 기준으로 정렬 할 때

<asp:LinkButton runat="server" ID="SortButtonOrderCode" Text="Order number" 
       CommandName="Sort" CommandArgument="OrderCode" /> 

그래서 예외가 발생합니다 : - "OrderCode"예를 들어 - 작동 주문 테이블의 "평면"필드에 의해 정렬

. 나는 Include = "Address" 관련 주소의 필드별로 정렬하는 EntityDataSource 속성이 있어야한다고 생각했지만 그렇지 않은 것 같습니다.

내가 테스트 내가 EntityDataSource 내부적으로 만들 것으로 기대 쿼리 확인하는 해킹했습니다

: 엔티티에 Linq에와

을 :

using (EntitiesContext ctx = new EntitiesContext()) 
{ 
    var result = from order in ctx.SOrder.Include("Address") 
       orderby order.Address.Name1 
       select order; 

    foreach (SOrder x in result) 
    { 
     string test=x.Address.Name1; 
    } 
} 

또는 법인 SQL로 :

string queryString = @"SELECT VALUE x FROM SOrder AS x 
        Order By x.Address.Name1"; 
using (EntitiesContext ctx = new EntitiesContext()) 
{ 
    ObjectQuery<SOrder> query = 
     new ObjectQuery<SOrder>(queryString, ctx).Include("Address"); 

    foreach (SOrder x in query.Execute(MergeOption.AppendOnly)) 
    { 
     string test=x.Address.Name1; 
    } 
} 

두 작품 모두! 정렬 된 결과가 표시됩니다.

이제 ListView에서이 정렬 작업을 수행하는 방법이 약간 손실됩니다. 누군가 내가 여기서 잘못하고있는 생각을 가지고 있습니까?

미리 감사드립니다.

답변

1

해결책을 직접 찾았습니다. 그것은 세 가지 누락 된 모든 문자 문제입니다 : 내 코드에서 위,이 ...

<asp:LinkButton runat="server" ID="SortButtonName" Text="Name" 
       CommandName="Sort" CommandArgument="Address.Name1" /> 

이 ... 잘못과로 대체 할 수있다 :

<asp:LinkButton runat="server" ID="SortButtonName" Text="Name" 
       CommandName="Sort" CommandArgument="it.Address.Name1" /> 

은 "그것을 사용 . " 관련 개체의 속성에 대한은 플랫 필드와 달리 필요 인 것으로 보입니다.따라서 두 가지 상술 한 두 번째 예에서 가능하다 : 신원없는 관련 특성에 대해 다시

CommandArgument="it.Address.AddressID" // works 
CommandArgument="Address.AddressID" // works as well 

:하지만 관련 오브젝트 (기본 키 필드) "신원 객체"에 대한

CommandArgument="it.OrderCode" // works 
CommandArgument="OrderCode" // works as well 

동일한 :

CommandArgument="it.Address.Name1" // works 
CommandArgument="Address.Name1" // does NOT work 

미친, 나는 (실수로)이 솔루션에 표시를 찾을 수있는 유일한 장소는,이 비디오는 다음과 같습니다

How Do I Use the Entity Data Source?

... 특히 약 9:40 분.

+0

+1이 동일한 문제로 나에게 1 톤의 악화를 저장합니다. 이 문제에 대한 해결책을 게시 해 주셔서 감사합니다! –

0

연관된 클래스는 CommandArguments 또는 DropDownList의 DataTextField 값을 작동하지 않을 수 있습니다. 목록 및 정렬을 위해 데이터 전송 객체를 사용할 수 있습니다.

public class OrderDTO 
{ 
    public string AddressName1 {get;set;} 
} 

using (EntitiesContext ctx = new EntitiesContext()) 
{ 
    var result = from order in ctx.SOrder 
       let dto = new OrderDTO 
          { 
            AddressName1 = order.Address.Name1 
            //bla bla 
          }; 
       orderby dto.AddressName1 
       select dto; 
} 
+0

의견에 감사드립니다. 질문 : LINQ 쿼리를 사용하여 코드를 어디에 배치해야합니까? 정렬 이벤트에 대한 이벤트 처리기 내부? 또는 CommandName 이벤트에서? LINQ 쿼리의 결과를 새 DataSource로 ListView에 할당해야합니까? – Slauma

+0

식 정렬을 원하지 않는다면 Page_Load에 쓰기를하고 결과에 '컨트롤'을 바인딩하십시오. 또는 자동 정렬을 원하므로 모든 열을 기준으로 그리드를 정렬 할 수 있습니다. 클라이언트 요청에 따라 여기에 새 코드를 작성하여 알려 드리겠습니다. – cem

+0

GridView로 이미 테스트했습니다. 그러나 "Address.Name1"과 같은 관련 필드를 열에 바인딩 할 수 없기 때문에 기본적으로 동일한 문제가 있습니다. Eval ("Address.Name1")이 포함 된 레이블이있는 템플릿 필드를 사용할 수 있습니다. 이것은 지금까지 연관된 필드가 그리드에 표시되도록 작동합니다. 그러나 선언적으로 템플릿 필드에서 열을 정렬하기 위해 SortExpression을 지정해야하며 SortExpression에서 "Address.Name1"을 사용하여 동일한 예외가 발생합니다. – Slauma

관련 문제