C# 尝试使用LINQ查询的排序顺序来构造SQL查询
我有一个基于以下内容排序的LINQ查询:C# 尝试使用LINQ查询的排序顺序来构造SQL查询,c#,sql,linq,C#,Sql,Linq,我有一个基于以下内容排序的LINQ查询: .OrderByDescending (l => l.foo == "ASDF") .ThenByDescending (l => l.IsValid) .ThenByDescending (l => l.Category == "X") .ThenByDescending (l => l.Size) .ThenByDescending (l => l.Description.Contains("Y") .Thenby (l
.OrderByDescending (l => l.foo == "ASDF")
.ThenByDescending (l => l.IsValid)
.ThenByDescending (l => l.Category == "X")
.ThenByDescending (l => l.Size)
.ThenByDescending (l => l.Description.Contains("Y")
.Thenby (l => l.ShelfNumber)
.Thenby (l => l.ItemNumber)
.ToList()
我相信可能有更好的方法来编写该查询,但我的问题是,如何才能为以这种方式排序的视图编写SQL子句
据我所见,ORDER BY子句不允许基于任何值,只允许基于列。要基于SQL语句中的值进行排序,可以使用如下CASE语句:
SELECT *
FROM [YourTable]
ORDER BY
(CASE
WHEN [foo] = 'ASDF' THEN 1
WHEN NOT ([foo] = 'ASDF') THEN 0
ELSE NULL
END) DESC
您可以使用IComparer的实现进行更复杂的比较,例如: 项目的我的比较器类:
private class MyComparer : IComparer<Tuple<int, int>>
{
private readonly double extraData;
public MyComparer(double extraData)
{
// TODO: Complete member initialization
this.extraData = extraData;
}
public int Compare(Tuple<int, int> x, Tuple<int, int> y)
{
if (extraData < 10)
return x.Item1 - x.Item1;
else
return x.Item2 - x.Item2;
}
}
私有类MyComparer:IComparer
{
私有只读双外部数据;
公共MyComparer(双重外部数据)
{
//TODO:完成成员初始化
this.extraData=extraData;
}
公共整数比较(元组x,元组y)
{
如果(外部数据<10)
返回x.Item1-x.Item1;
其他的
返回x.Item2-x.Item2;
}
}
以及守则:
List<Tuple<int, int>> collection = new List<Tuple<int, int>>();
//Fill the list...
double extraData = 0.5d;
MyComparer comparer = new MyComparer(extraData);
collection.OrderByDescending(x => x, comparer);
列表集合=新列表();
//填写清单。。。
双外数据=0.5d;
MyComparer comparer=新的MyComparer(extraData);
collection.OrderByDescending(x=>x,comparer);
问题是,如果要使用在以前的LINQ中创建的匿名结构,则不能使用这种方法。可以使用case语句按表达式排序。请参阅。假设这是一个LINQ to SQL查询提供程序,只需查看您已经编写的查询的生成SQL,就可以了解如何执行。ORDER BY子句要求我使用TOP或for XML或OFFSET:SQL46047:ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP或FORXML或OFFSET。