通过给我问题Linq查询顺序

时间:2015-10-23 22:15:19

标签: sql linq

我有一个存储过程,我使用连接在SSMS中编写,显示在下面

select distinct z.size, z.SortID from [ProductAttributes] x join [Product] y on x.ProductID = y.ProductID join [ProductSort] z on x.Size = z.Size where x.ProductID = @productID order by z.SortID

当我执行它时,返回我想要的值并通过sortID对它们进行排序,我稍后将其提供给ASP MVC中的下拉列表。

此后我使用linq编写了存储的prodecure查询,如下所示

var sizes = (from x in db.ProductAttributes
                     join y in db.Products on x.ProductID equals y.ProductID
                     join z in db.ProductSorts on x.Size equals z.Size
                     where x.ProductID == productID
                     orderby z.SortID 
                     select x.Size).Distinct();

问题是使用这个linq语句,它没有按正确的顺序放置数据,我试图按大小M,L,XL,XXL,XXXL订购下拉列表,但它返回L,M, XL,XXL,XXXL,所以我假设它按字母顺序排序数据。

如果查看常规sql语句,查询的开头有select子句后的2个项,我可以不在linq中做同样的事情。

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

快速解决方案

尝试在选择后对其进行排序:

var sizes = (from x in db.ProductAttributes
                     join y in db.Products on x.ProductID equals y.ProductID
                     join z in db.ProductSorts on x.Size equals z.Size
                     where x.ProductID == productID
                     select x.Size).Distinct();
sizes = sizes.OrderBy(x=>x.Size.SortID); //x.Size.SortID should be your sort ID.

我不知道您的表之间的关系,因此请尝试使用您自己的实现来遵循我的代码。

答案 1 :(得分:1)

在这种情况下,我会在查询后强制进行排序。

以下是一些方法。

select full_name, string_agg(substr(initials, 1,1)||'.', ' ') initials
from (
    select full_name, unnest(string_to_array(full_name,' ')) initials
    from my_table
    ) sub
group by 1;

       full_name        |  initials   
------------------------+-------------
 Phil Smith             | P. S.
 Joe Blow               | J. B.
 Jose Maria Allan Pride | J. M. A. P.
 Eric A. Korver         | E. A. K.
(4 rows)

这忽略了对数据库的排序,并根据var allPossibleSizesInCorrectOrder = new [] { "XXXS", "XXS", "XS", "S", "M", "L", "XL", "XXL", "XXXL", }; var ordering = allPossibleSizesInCorrectOrder .Select((x, n) => new { x, n }) .ToDictionary(xn => xn.x, xn => xn.n); var sizes = ( from x in db.ProductAttributes join y in db.Products on x.ProductID equals y.ProductID join z in db.ProductSorts on x.Size equals z.Size where x.ProductID == productID select x.Size ) .Distinct() .ToArray() .OrderBy(x => ordering[x]) .ToArray(); 数组的顺序对内存进行排序。

你也可以这样做:

allPossibleSizesInCorrectOrder