2011-08-18 8 views
2

정말 간단해야한다고 생각합니다.하지만 어떻게해야하는지 모르겠습니다. int 유형의 하나의 열을 선택하는 linq 쿼리가 있고 정렬해야합니다.Linq 목록을 하나의 열로 정렬하십시오.

var values = (from p in context.Products 
       where p.LockedSince == null 
       select Convert.ToInt32(p.SearchColumn3)).Distinct(); 
values = values.OrderBy(x => x); 

SearchColumn3은 연산 유형 문자열이지만 정수 만 포함합니다. 그래서 생각, Int32로 변환 및 주문 확실히 좋은 1,2,3 정렬 된 값 목록을 줄 것이다. 그러나 그 대신 목록은 문자열과 같이 순서가 유지됩니다.

199 20 201 

업데이트 : 나는 C# 코드와 LinqPad 몇 가지 테스트를 완료했습니다. LinqPad는 다음과 같은 SQL 생성

SELECT [t2].[value] 
FROM (
    SELECT DISTINCT [t1].[value] 
    FROM (
     SELECT CONVERT(Int,[t0].[SearchColumn3]) AS [value], [t0].[LockedSince], [t0].[SearchColumn3] 
     FROM [Product] AS [t0] 
     ) AS [t1] 
    WHERE ([t1].[LockedSince] IS NULL) 
    ) AS [t2] 
ORDER BY [t2].[value] 

을 그리고 내 SQL 프로파일 러 내 C# 코드는 SQL의이 조각을 생성 말한다 :

SELECT DISTINCT a.[SearchColumn3] AS COL1     
FROM [Product] a 
WHERE a.[LockedSince] IS NULL 
ORDER BY a.[SearchColumn3] 

는 그래서 C#을 Linq에 코드처럼 그냥 Convert.ToInt32를 생략합니다. 아무도 이것에 대해 유용한 것을 말할 수 있습니까?

+0

오타가 있습니까? ... 당신은'diameters' 변수를 분류되지만'values' 변수로 선택된다. 'diameter = values.OrderBy (x => x);를 읽어야할까요? –

+0

아마도 '값'대신 '직경'을 정렬했기 때문일 수 있습니까? –

+0

'값'으로 선택하지만 '직경'으로 정렬됩니다. 이 문제는 단지 복사 편집 문제입니까 아니면 실제 코드입니까? – ChrisF

답변

2

같은 대답은 내 다른 질문, 그게 Linq 공급자 내가 Telerik OpenAccess와 함께 제공되는 것으로 판명 ORM 표준 Linq SQL 공급자와 다른 일을 않습니다! 시작 게시물에 게시 한 SQL을 참조하십시오! 나는 완전히 이와 같은 것을 기대하지 않았지만 Telerik OpenAccess는 여전히 많은 개선이 필요하다고 생각합니다. 따라서 사용하기 전에주의하십시오. 그것은 좋아 보이지만 몇 가지 심각한 단점이 있습니다. 당신은 너무 Telerik OpenAccess를 ORM이 문제를 해결할 수

-

-2

정말 메서드를 호출하면 때까지 값을 가지고 있지 도다 있도록 values 변수가하는 Linq 표현의 결과이기 때문에 등 ToList, ToArray은 Get 다시 예

변수 xOrderBy 메서드에서는 p.SearchColumn3으로 처리되므로 문자열입니다.

p.SearchColumn3OrderBy 방법보다 먼저 정수가되도록해야합니다. 당신은 다음과 같이 코드에의 let 문을 추가해야합니다

var values = (from p in context.Products 
       where p.LockedSince == null 
       let val = Convert.ToInt32(p.SearchColumn3) 
       select val).Distinct(); 
values = values.OrderBy(x => x); 

또한, 당신은 처음으로 문으로 순서를 결합 할 수 있습니다, 그것은 잘 될 것입니다.

+2

-1'values' 변수는'Int32' 유형 만 포함합니다 - 문자열을 포함하지 않습니다. 제안 된 코드는 OP 코드와 아무런 차이가 없습니다. –

0

이 문제를 재현 할 수 없습니다. 하지만 조사 할 때 컬렉션을 열거하고 있는지 확인하십시오. 어떻게 결과를 확인하고 있습니까? 당신이 values 열거에서 그들을 검색 할 수 순서만을 -

values = values.OrderBy(x => x); 
foreach (var v in values) 
{ 
    Console.WriteLine(v.ToString()); 
} 

이 다른 곳 데이터베이스 또는의 레코드의 순서를 변경하지 않습니다 기억하십시오.

3

[내가 Telerik에서 작동 면책 조항]. 여기에 내가 제안 할 것이있다.

var values = (from p in context.Products 
       where p.LockedSince == null 
       orderby "cast({0} as integer)".SQL<int>(p.SearchColumn3) 
       select "cast({0} as integer)".SQL<int>(p.SearchColumn3)).ToList().Distinct(); 

OpenAccess는 생성 된 SQL 문에 특정 sql 코드를 추가 할 수있는 SQL 확장 메서드를 제공합니다. 우리는이 문제를 개선하기위한 작업을 시작했습니다. 지적 해 주셔서 감사합니다.

감사

랄프

관련 문제