Filtering with Linq.Where
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
Direção de pesquisa
Comece com a expressão de consulta LINQ e o exemplo filterByName na issue e, em seguida, reproduza o SQL gerado usando SQLProvider 1.1.91, FSharp.Core 4.7.2 e .NET Core 3.1. Compare o alias da tabela usado para o campo Name filtrado com o SQL esperado; considera-se concluído quando o filtro aponta para a tabela associada pretendida sem exigir o workaround de inverter a ordem das tabelas.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Describe the bug
Trying to execute a join and filtering using Linq.Where on the second table produces a sql where clause where the field is linked to the first table not the second one.
To Reproduce
let filterByName (filter: Filter): Filtering =
fun q ->
match filter.Name with
| ValueNone -> q
| ValueSome n -> n |> Str.value |> (fun v -> q.Where(fun e -> e.Name.Contains(v)))
let search: Insurer.Query.DbSearch =
fun (tenantId, filter) ->
let tenantId = tenantId |> TenantId.value
let ctx = Db.readerCtx ()
query {
for i in ctx.Insurance.InsurerTable do
join c in ctx.People.Company on
((i.TenantId, i.PersonId) = (c.TenantId, c.Id))
where
(c.TenantId = tenantId)
select c
}
|> filterByName filter
generates the following sql clause:
SELECT [Column List]
FROM [Insurance].[InsurerTable] as i
INNER JOIN [People].[Company] as c
on i.[TenantId] = c.[TenantId] AND i.[PersonId] = c.[Id]
WHERE ((c.[TenantId] = 561) AND (c.[Name] LIKE N'%Name209092560%'))
Expected behavior
SELECT [Column List]
FROM [Insurance].[InsurerTable] as i
INNER JOIN [People].[Company] as c
on i.[TenantId] = c.[TenantId] AND i.[PersonId] = c.[Id]
WHERE ((c.[TenantId] = 561) AND (i.[Name] LIKE N'%Name209092560%'))
Please, note the expected clause uses i.[Name] instead of c.[Name] in WHERE section.
Additional context
SQLProvider (1.1.91)
FSharp.Core (4.7.2)
Net Core 3.1
Workaround for this particular case
Inverting the order of the tables in the query solves the problem:
for c in ctx.People.Company do
join i in ctx.Insurance.InsurerTable on
((c.TenantId, c.Id) = (i.TenantId, i.PersonId))
But this is valid in this case, in many others, this solution won't be possible.
- Linguagem predominante
- F#
- Estrelas
- 627
- Forks
- 147
- Merge médio
- 2h 2min
- PRs com merge (30d)
- 1
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Sem guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de fsprojects/SQLProvider
-
enhancement
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 55/100
fsprojects/SQLProvider#872 · 2 comentários ·
-
Repo Assist?Abertaenhancement
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 10/100
fsprojects/SQLProvider#870 · 1 comentário ·
-
postgresql
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 58/100
fsprojects/SQLProvider#869 · 2 comentários ·
-
documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 42/100
fsprojects/SQLProvider#868 · 2 comentários ·
-
sql server
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
fsprojects/SQLProvider#851 · 1 comentário ·
Todas as issues de fsprojects/SQLProvider
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
Mantenedores costumam responder em até 1 dia
-
review: medium
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
langgenius/dify#43296 · 1 reação ·
Mantenedores costumam responder em até 1 dia
-
component/data-layer
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
Mantenedores costumam responder em até 1 dia
-
area/redis
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
quarkusio/quarkus#57063 · 1 comentário ·
Mantenedores costumam responder em até 1 dia