Параметрический запрос LINQ

Это еще один взгляд на доступ к динамическим объектам в F#. Здесь я использую let y = x.Where(fun x -> x.City ="London").Select("new(City,Zip)") для параметризации запрос и извлечь необходимые элементы. Они будут соответствовать столбцам в SQL-запросе и будут представлены свойством контекста данных. Это та часть, которую я хотел бы передать в качестве параметра.

type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc">
let db = Northwind.GetDataContext()
let query2 = query { for customer in db.Customers do
                     select customer}  |> Seq.toArray
let qryfun (x:Northwind.ServiceTypes.Customer) =
    query { for x in query2 do
            select (x.City,x.CompanyName,x.Country)}

В принципе, я хотел бы передать не только x, но и x.*. Поскольку я обращаюсь к одной фиксированной базе данных, я могу вынести x. Однако теперь у меня есть 40 небольших функций, извлекающих разные столбцы. Можно ли выделить его в одну функцию и передать свойство в качестве аргумента? Так что иногда я извлекаю x.City, а иногда x.Country. Я пытался использовать цитаты, но не могу их правильно соединить, и, возможно, это неправильный подход.


person s952163    schedule 11.04.2016    source источник
comment
Я думаю, вы можете просто вернуть кортеж из запроса, например select (customer, customer.City), и ваш qryfun примет кортеж в качестве параметра. Поскольку все разнообразие свойств клиентов не имеет статического типа, вы либо используете кортежи для промежуточного потока данных между функциями/преобразованиями, либо определяете свой собственный тип записи. и сопоставьте его в своем запросе   -  person paulik    schedule 11.04.2016
comment
@paulik, спасибо. Я не уверен, что это выполнимо. Например. let qryfun (x, x.column) = query { for x in query2 do select (x.column)} где x — это таблица БД (Northwind.ServiceTypes.Customer), а x.column — это столбец (или поле) в таблице Customer, это может быть x.City, x.Country и т. д.... тогда я бы назвал qryfun (Northwind.ServiceTypes.Customer, Northwind.ServiceTypes.Customer.City) Второй аргумент сложен, потому что Northwind.ServiceTypes.Customer.City принадлежит каждой записи, а не таблице. Если вы посмотрите на упомянутый вопрос, я создал его из строки (новый (город, страна))   -  person s952163    schedule 12.04.2016


Ответы (1)


Что касается сращивания цитат, это работает для меня:

open System.Linq

type record = { x:int; y:string }

let mkQuery q =
    query {
        for x in [{x=1;y="test"}].AsQueryable() do
        select ((%q) x)
    }

mkQuery <@ fun r -> r.x, r.y @>
|> Seq.iter (printfn "%A")
person kvb    schedule 11.04.2016