過濾
控制器動作中的如下代碼: students <- case searchString' of
Nothing -> query @Student |> fetch
(Just str) -> 查詢 @Student |> fetch
|> queryOr
(filterWhereILike (#lastName, "%"/span> <> str <> "%"/span>)
(filterWhereILike (#firstMidName, "%"/span> <> str <> "%"/span>)
|> 獲取
做法是:
- 如果
searchString'是可用的,回傳lastName或firstMidName符合searchString'的學生。 - 否則,回傳所有的學生 。
這很好用!
這很好用。
排序
過濾后,我想根據另一個也許是文本進行排序。我想做這樣的事情:設定queryBuilder,并完成過濾步驟:
let queryBuilder = case searchString' of
Nothing -> 查詢 @Student
(Just str) -> query @Student
|> queryOr
(filterWhereILike (#lastName, "%"/span> <> str <> "%"/span>)
(filterWhereILike (#firstMidName, "%"/span> <> str <> "%"/span>)
然后進行排序:
students <- case sortOrder of>
(Just "NameAsc") -> queryBuilder |> orderByAsc #lastName |> fetch
(Just "NameDsc") -> queryBuilder |> orderByDesc #lastName |> fetch
(Just "DateAsc") -> queryBuilder |> orderByAsc #enrollmentDate |> fetch
(Just "DateDsc") -> queryBuilder |> orderByDesc #enrollmentDate |> fetch
Nothing -> queryBuilder |> orderByAsc #lastName |> fetch
_ -> queryBuilder |> orderByAsc #lastName |> fetch
然而,這(可以理解)會導致以下結果:
- Couldn't match expected type 'QueryBuilder "students"'
與實際的type 'NoJoinQueryBuilderWrapper "students"'。
- In the expression:
查詢 @Student
|>。
查詢或
(filterWhereILike (#lastName, "%"/span> <> str <> "%"/span>)
(filterWhereILike (#firstMidName, "%"/span> <> str <> "%"/span>)
In a case alternative:
(Just str)
-> 查詢@Student
|>
疑問或
(filterWhereILike (#lastName, "%"/span> <> str <> "%"/span>)
(filterWhereILike (#firstMidName, "%"/span> <> str <> "%"/span>)
在運算式中。
case searchString' of
Nothing -> 查詢 @Student
(Just str)
-> 查詢 @Student (Just str)
|>
疑問或
(filterWhereILike (#lastName, "%"/span> <> str <> "%"/span>)
(filterWhereILike (#firstMidName, "%" <> str <> "%"))typeecheck
提問
。對于如何設定這個問題有什么建議嗎?
原始代碼
如果有幫助的話,這或多或少是由C#轉換而來的如果有幫助的話,這或多或少是由C#轉換而來的
var students = _context.Students.Select(student => student)。
if (!String.IsNullOrEmpty(searchString))
students = students.Where(student =>
student.LastName.Contains(搜索字串) ||
student.FirstMidName.Contains(searchString))。
if (sortOrder == SortOrder.NameAsc) students = students.OrderBy( student => student.LastName) 。
else if (sortOrder == SortOrder.NameDsc) students = students.OrderByDescending( student => student.LastName) 。
else if (sortOrder == SortOrder.DateAsc) students = students.OrderBy( student => student.EnrollmentDate) 。
else if (sortOrder == SortOrder.DateDsc) students = students.OrderByDescending( student => student.EnrollmentDate) 。
else students = students.OrderBy( student => student.LastName) 。
參考文獻
IHP手冊的QueryBuilder部分:既然我們已經脫離了查詢的范疇。
Update 2
好吧,我能夠通過為查詢設定一個不被參考的引數來排除排序子句的因素:
let sortClause q = (case sortOrder of)
(Just "NameAsc"/span>) -> orderByAsc #lastName
(Just "NameDsc") -> orderByDesc #lastName
(Just "DateAsc") -> orderByAsc #enrollmentDate
(Just "DateDsc") -> orderByDesc #enrollmentDate
Nothing -> orderByAsc #lastName
_ -> orderByAsc #lastName)
我可以使用sortClause,但是,我必須在queryOr中添加一個 "no-op "的呼叫,以使型別一致:
students <- case searchString' of
Nothing ->查詢 @Student
|> queryOr
(filterWhereILike (#lastName, "%"/span>)
(filterWhereILike (#firstMidName, "%") )
|> sortClause (query @Student)
|> fetch
(Just str) -> 查詢 @Student)
|> queryOr
(filterWhereILike (#lastName, "%"/span> <> str <> "%"/span>)
(filterWhereILike (#firstMidName, "%"/span> <> str <> "%"/span>)
|> sortClause (query @Student)
|> fetch
因此,我想對于這種方法,問題是,有沒有一種方法可以避免在第一個分支中使用 "no-op" queryOr?
uj5u.com熱心網友回復:
我可以重現這個問題。這是IHP中的一個錯誤,即queryOr的型別過于特殊。通過https://github.com/digitallyinduced/ihp/pull/1081修復
你能不能試一試。請參閱https://ihp.digitallyinduced.com/Guide/updating.html#updating-to-a-specific-git-commit以更新到一個特定的提交。
與該錯誤無關,這里有另一個版本的動作:
action StudentsAction = do
let searchString' = paramOrNothing @Text "query"
let sortOrder = paramOrNothing @Text "sort"
let filterWhereName = case searchString' of
(Just searchQuery) -> filterWhere (#lastName, "%"/span> <> searchQuery <> "%"/span>)
Nothing -> query -> query
let orderBySortParam =case sortOrder of
(Just "NameAsc"/span>) -> orderByAsc #lastName
(Just "NameDsc") -> orderByDesc #lastName
(Just "DateAsc") -> orderByAsc #enrollmentDate
(Just "DateDsc") -> orderByDesc #enrollmentDate
-> orderByAsc #lastName
students <-查詢@Student。
|> filterWhereName
|> orderBySortParam
|> fetch
render IndexView { . }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/316934.html
標籤:

