Entity Framework и анонимные типы в F # - PullRequest
5 голосов
/ 17 декабря 2011

Попытка получить запрос с работающим анонимным типом:

let temporaryBookModel =
  query <@ context.Books 
    |> Seq.filter (fun book -> book.Id = bookId)
    |> Seq.map(fun item -> (item.Id, item.ParentUser.Id, item.ParentUser.Alias, item.Tagline, item.Title, item.Visible, item.CreatedDate))
    |> Seq.head @>

И я продолжаю получать:

{"Только беспараметрические конструкторы и инициализаторы поддерживаются в LINQ to Entities. "}

Что имело бы смысл, если бы я отображал значения непосредственно на тип, но анонимные типы не должны вызывать это исключение, как мне кажется, поскольку они основаны на функциональности инициализатора объекта? К сожалению, все, что я нашел в анонимных типах, похоже, говорит, что это правильный синтаксис. Это или что-то вроде этого:

let temporaryBookModel =
  query <@ context.Books 
    |> Seq.filter (fun book -> book.Id = bookId)
    |> Seq.map(fun item -> (("a", item.Id), ("b", item.ParentUser.Id), ("c", item.ParentUser.Alias), ("d", item.Tagline), ("e", item.Title, item.Visible), ("f", item.CreatedDate)))
    |> Seq.head @>

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Поддерживает ли F # анонимные типы?

Как я знаю - это не так. Но есть 2 возможных пути обхода проблемы:

  • используйте кортежи (как вы используете)
  • использовать типы записей, но в этом случае вам необходимо определить запись раньше. Примерно так:
type Book =
    { 
        Id: int;
        ParentId: int;
        ParentAlias: string;
        TagLine: string;
        Title: string;
        Visible: bool;
        CreatedDate: DateTime;
    }

И строка кода использования будет выглядеть так:

...
|> Seq.map 
    (fun item -> 
        {
            Id = item.Id; 
            ParentId = item.ParentUser.Id;
            ParentAlias = item.ParentUser.Alias;
            TagLine = item.Tagline;
            Title = item.Title;
            Visible = item.Visible;
            CreatedDate = item.CreatedDate
        }) 

Дополнительные объяснения вы можете найти в аналогичном вопросе здесь

Обновление:

Использование типов записей, поскольку для меня это более элегантное решение, НО похоже, что оно не работает с Entity Framework - F # -> Запись с конструктором без параметров? .

Таким образом, согласно ответу Томаса Петричека, он должен быть объявлен явным типом с параметрами без конструктора и необходимыми свойствами.

0 голосов
/ 10 апреля 2019

У меня нет настройки EF или вашей модели, но я использую новую F # 4.6 Anonymous Records особенность этого примера, которая очень близка к тому, что вы пытались, работать.* Обратите внимание на использование символа | внутри фигурных скобок анонимной записи.Это то, что сейчас отличает обычные записи от анонимных записей в F #.Кроме того, в приведенном выше примере обратите внимание, что имена свойств в типе Anonymous Record необходимо указывать явно, в отличие от C #, имена свойств не являются неявными в зависимости от их свойства / поля источника из присваивания.Функция для разрешения неявных имен свойств предлагается в качестве последующего изменения в будущих спецификациях языка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...