Если вы используете React Router, я бы предложил заглянуть в библиотеку реакции-router-bootstrap, которая имеет удобный компонент LinkContainer. Этот компонент предотвращает перезагрузку страницы по умолчанию, поэтому вам не нужно иметь дело с событием.
В вашем случае это может выглядеть примерно так:
import { LinkContainer } from 'react-router-bootstrap';
<LinkContainer to={givePathHere}>
<span className="upvotes" onClick={this.upvote}>upvote</span>
</LinkContainer>
Как я могу сделать заказ, используя указанный выше синтаксис без использования синтаксиса расширения.
Используйте запятую между полями:
orderby a, b
А что делает orderby, orderby?
Когда вы используете orderby
дважды подряд, элементы концептуально сначала сортируются с использованием первого orderby
, а затем снова отсортированы с использованием второго порядка orderby
. Поскольку сортировка определяется как стабильная сортировка (объекты, которые связаны со вторым порядком по
, останутся в том же порядке, что и после сортировки с первым порядком по
это фактически означает, что это:
var query = from x in l
orderby x.A
orderby x.B
select x;
эквивалентно:
var query = from x in l
orderby x.B, x.A
select x;
В результате термины orderby
заменены местами, которые вы, вероятно, предполагали.
Тестирование с LINQ to SQL
Это можно проверить, попробовав в LINQ to SQL. Я создал следующий запрос:
var query = from a in dc.Orders
orderby a.Date
orderby a.CustomerID
select a;
, и это был сгенерированный SQL:
SELECT [t0].[ID], [t0].[CustomerID], [t0].[Date], [t0].[Description]
FROM [dbo].[Order] AS [t0]
ORDER BY [t0].[CustomerID], [t0].[Date]
Обратите внимание, что заказ по a.Date
не игнорируется. Оба термина включены в предложение ORDER BY, но в обратном порядке, чем вы могли предполагать.
Выполнение ThenBy в синтаксисе выражения запроса является простым, просто следуйте за начальным orderby через запятую и 2-е утверждение:
// Create the data source.
List<Student> students = GetStudents();
// Create the query.
IEnumerable<Student> sortedStudents =
from student in students
orderby student.Last ascending, student.First ascending
select student;
Применение второго orderby с помощью стандартных операторов запроса (методы расширения) фактически применит второй orderby к результату запроса, который включает первый orderby. По сути, будет применен только второй orderby, хотя вы все равно потратите время процессора на вычисление первого orderby.
На самом деле ответ на этот вопрос содержится непосредственно в документации MSDN для методов Enumerable.OrderBy и Enumerable.ThenBy.
Поскольку IOrderedEnumerable наследуется от IEnumerable, вы можете вызвать OrderBy или OrderByDescending на результаты вызова OrderBy, OrderByDescending, ThenBy или ThenByDescending. Это вводит новое первичное упорядочивание, которое игнорирует ранее установленное упорядочивание.
Ответ на этот вопрос должен быть таким
orderby 1, 2
Я оставлю часть № 2 кому-нибудь другому.