2015-03-13 3 views
1

Я пытаюсь сделать расширение типа для MongoDB C# Driver, который вернет тип параметра вместо null при попытке выполнить запрос, который дает 0 результатов.Разрешение нулей на тип записи F #

Я столкнулся с несколькими проблемами в пути, но сейчас на пути есть только одна вещь.

Вот код

[<Extension>] 
type Utils() = 
    [<Extension>] 
    static member inline tryFindOne(x: MongoCollection<'T>, query) = 
     match x.FindOne(query) with 
     | null -> None 
     | value -> Some value 

[<CLIMutable>] 
type Entity = 
    { Id : ObjectId; Name : string } 
    static member Create(name) = 
     { Id = ObjectId(); Name = name } 

Проблема, конечно, в том, что тип записи Entity в F # компилятор не соответствует типу ограничения метода расширения ('T : null), но я должен иметь contraint чтобы иметь возможность сопоставить шаблон с нулями. Конечно, это своего рода бессмысленная вещь, потому что тип Entity очень «обнуляется» для целей взаимодействия и будет возвращен как null, когда вы пытаетесь запросить коллекцию MongoDB, которая дает 0 результатов. Я попытался установить атрибут [<AllowNullLiteral>], но, к сожалению, он работает только с классами. Так увы, я застрял, я мог бы сделать Entity в класс вместо этого, но я думаю, что записи более идиоматичны F #.

ответ

3

Я думаю, что следующее должно работать:

[<Extension>] 
type Utils() = 
[<Extension>] 
static member inline tryFindOne(x: MongoCollection<'T>, query) = 
    let theOne = x.FindOne(query); 
    if (box theOne = null) None else Some(theOne) 

Я позаимствовал идею от должности Сергея Тихона здесь: https://sergeytihon.wordpress.com/2013/04/10/f-null-trick/

+0

Да, это будет работать. Это немного фанковое решение, но оно работает. Благодаря! –

+0

ReferenceEquals (null, entity) также может работать. – FuleSnabel

Смежные вопросы