Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试使用LINQ查询的排序顺序来构造SQL查询_C#_Sql_Linq - Fatal编程技术网

C# 尝试使用LINQ查询的排序顺序来构造SQL查询

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

我有一个基于以下内容排序的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 => 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。