1) Установите System.Linq.Dynamic
2) Добавьте следующий код
public static class OrderUtils
{
public static string ToStringForOrdering(this Expression> expression, bool isDesc = false)
{
var str = expression.Body.ToString();
var param = expression.Parameters.First().Name;
str = str.Replace("Convert(", "(").Replace(param + ".", "");
return str + (isDesc ? " descending" : "");
}
}
3) Напишите свой переключатель для выбора Lambda function
public static class SortHelper
{
public static Expression> UserApp(string orderProperty)
{
orderProperty = orderProperty?.ToLowerInvariant();
switch (orderProperty)
{
case "firstname":
return x => x.PersonalInfo.FirstName;
case "lastname":
return x => x.PersonalInfo.LastName;
case "fullname":
return x => x.PersonalInfo.FirstName + x.PersonalInfo.LastName;
case "email":
return x => x.Email;
}
}
}
4) Используйте ваши помощники
Dbset.OrderBy(SortHelper.UserApp("firstname").ToStringForOrdering())
5) Вы можете использовать его с pagging ( PagedList )
public virtual IPagedList GetPage(Page page, Expression> where, Expression> order, bool isDesc = false,
params Expression>[] includes)
{
var orderedQueryable = Dbset.OrderBy(order.ToStringForOrdering(isDesc));
var query = orderedQueryable.Where(where).GetPage(page);
query = AppendIncludes(query, includes);
var results = query.ToList();
var total = Dbset.Count(where);
return new StaticPagedList(results, page.PageNumber, page.PageSize, total);
}
Объяснение
System.Linq.Dynamic позволяет нам установить строковое значение в методе OrderBy. Но внутри этого расширения строка будет анализироваться на Lambda. Поэтому я подумал, что это сработает, если мы проанализируем Lambda на строку и передадим ее методу OrderBy. И это работает!
Если там написано
Patch failed at 0001 commit message for F
, то запустите
$ head -1 .git/rebase-apply/0001
From ad1c7739c1152502229e3f2ab759ec5323988326 Mon Sep 17 00:00:00 2001
, чтобы получить SHA ad1c77
из неудачного коммита, а затем используйте git-шоу ad1c77
, чтобы посмотреть на него.
Давайте начнём с этого дерева:
A---B---C---D
\
E---F---G
$ git checkout G
$ git rebase D
Когда возникает конфликт rebase, это конфликт между
C--D
) от общего предка (B
) PLUS уже возвращенными изменениями и уже разрешенным конфликтом (E'
) против F
)Посмотрим, что произойдет:
1) A---B---C---D---E' <- E patched and committed successfully as E'
2) A---B---C---D---E'--- <- failed to patch F onto E'
Вот сообщение об ошибке:
First, rewinding head to replay your work on top of it...
Applying: commit message for F
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Failed to merge in the changes.
Patch failed at 0001 commit message for F
Сначала видно, что это был F
, так как появляется сообщение коммита. Однако, если все ваши сообщения коммита выглядят как "foo", "документация" или "некоторые исправления", то это не поможет, и вам действительно нужен SHA id ad1c77
или содержимое патча.
F
:Когда он перечисляет конфликт rebase, он говорит что-то вроде:
Patch failed at 0001 commit message for F
Теперь посмотрите в .git/rease-apply/
, где вы найдете файл патча 0001
:
$ ls .git/rebase-apply
0001 head-name msg orig-head sign
0002 info msg-clean patch threeway
apply-opt keep next quiet utf8
final-commit last onto rebasing
Файл патча включает в себя оригинальный коммит-ид
$ head -1 .git/rebase-apply/0001
From ad1c7739c1152502229e3f2ab759ec5323988326 Mon Sep 17 00:00:00 2001
Вы можете посмотреть на это.
Должен быть более простой способ, но он работает.
Обратите внимание, что тот факт, что патч вышел из строя, может быть связан с другим коммитом (если вы делаете ребейсинг на общего предка HEAD
и цель ребейсинга). Найти этот коммит довольно сложно, хотя вы можете попробовать сделать переброс в обратном направлении, чтобы найти его:
$ git checkout D
$ git rebase G
Начиная с Мерзавца 2.17 (март 2018), Вы не должны должны быть использовать rebase-apply
.
новое" --show-current-patch
" опция уступает дорогу конечному пользователю, сталкивающемуся для получения diff
применяемый, когда" git rebase
" (и" git am
") останавливается с конфликтом.
См. fbd7a23 фиксации, фиксация 6633529 , фиксация 984913a (11 февраля 2018) [1 114] Nguyб» … n ThГЎi Ngб» Ќc Duy (pclouds
) .
<глоток> (Объединенный [1 115] Junio C Hamano - gitster
- в [1 116] фиксация 9ca488c , 06 марта 2018) глоток>
am
: добавьте - выставочный текущий патч<глоток> Signed-off-by: Nguyб» … n ThГЎi Ngб» Ќc Duy глоток>
Указание на пользователя к [1 110] может поощрить их бездельничать там, который не является хорошей вещью.
С этим, пользователь не должен иметь в наличии путь где-нибудь (потому что после нескольких команд, путь может быть вне буфера scrollback), когда они должны посмотреть на патч.
Посмотрите больше в" Шоу текущий мерзавец интерактивная переосновная операция "
Пример:
C:\Users\VonC\repo\src>git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: change code
Using index info to reconstruct a base tree...
M a/src/file
Falling back to patching base and 3-way merge...
Auto-merging a/src/file
CONFLICT (content): Merge conflict in a/src/file
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch' to see the failed patch <======
Patch failed at 0001 change code
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Вы тогда добрались бы:
C:\Users\VonC\rep\src>git am --show-current-patch
commit xxx (master)
Author: VonC <vonc@vonc.com>
Date: Mon Nov 4 13:59:18 2019 +0100
change code
diff --git a/a/src/file b/a/src/file
index yyy..zzz 100644
--- a/a/src/file
+++ b/a/src/file
@@ -13,5 +13,5 @@ file: /a/src
content line 1
content line 2
content line 3
content line 4
-content line 5
-content line 6
+content bis line 5
+content bis line 6