2016-02-01 16 views
6

Używam SqlCommandProvider i muszę dostać jakieś dane dla każdego identyfikatora w kolekcji idJak określić parametr jako kolekcji w CommandText

let ids=["B058A99-C4B2-4CC3-BA9F-034B1F1ECCBD";"A09C01C-D51B-41C1-B44C-0995DD285088"] 
[<Literal>] 
let qLogo ="""SELECT Id,LogoUrl FROM Hotels WHERE Id IN (@IDS)""" 
let queryLogo = new SqlCommandProvider<qLogo,constring>() 
queryLogo .Execute(ids)//i need to be able to pass a collection here 

`

+0

Co o 'id |> Seq.collect queryLogo.Execute'? (Nie testowałem, ale powinno być blisko) – Carsten

+1

'ids |> Seq.collect queryLogo.Execute' przejdzie na serwer dla każdego identyfikatora osobno, prawdopodobnie będę miał 500+ identyfikatora czasu, więc zajmie to dużo czasu – Evren

+0

Jaki jest typ 'queryLogo.Execute'? –

Odpowiedz

2

Krótko mówiąc, SqlCommandProvider nie jest jeszcze poprawny dostawca typów, aby to zrobić (zakładając, że nie bierzesz pod uwagę konkatenacji ciągów w celu zbudowania zapytania). Powodem jest to, że SQL Server akceptuje tylko parametry tablicy poprzez wywoływanie procedury składowanej i przekazywanie wartościowego parametru tabeli.

Tak więc, aby wywołać procedurę przechowywaną, musisz uzyskać SqlProgrammabilityProvider, aby to osiągnąć. Ale musisz utworzyć typ tabeli i procedurę składowania z góry, jak opisano w typie provider documentation (przewiń w dół do sekcji "Parametry tabelaryczne (TVP)").

Stosowna dyskusja: How to use SQL IN statement in fsharp.data.sqlclient?

Powiązane problemy