我有一个存储过程,我使用连接在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中做同样的事情。
任何帮助将不胜感激
答案 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