2011-12-17 36 views
5

Đang cố gắng để có được một truy vấn với một kiểu làm việc vô danh:Entity Framework và Anonymous loại trong F #

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 @> 

Và tôi tiếp tục nhận được:

{ "Chỉ nhà xây dựng parameterless và initializers được hỗ trợ trong LINQ to Entities. "}

Điều gì sẽ có ý nghĩa nếu tôi ánh xạ trực tiếp các giá trị cho loại, nhưng các loại ẩn danh không được ném thi s ngoại lệ tôi sẽ nghĩ rằng kể từ khi họ được dựa trên chức năng khởi tạo đối tượng? Thật không may bất cứ điều gì tôi tìm thấy trên các loại vô danh dường như nói đây là cú pháp chính xác. Hoặc như thế này:

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 @> 
+0

F # không có khái niệm về 'loại ẩn danh' - đó là tính năng C#. Ở đây bạn đang xây dựng các bộ dữ liệu đơn giản. – ildjarn

+0

Bạn đã thử cách ly lỗi thành một cấu trúc cụ thể hơn (ví dụ: trước tiên hãy thử Seq.map (vui vẻ i -> i.Id), Seq.map (vui vẻ i -> i.Id, i.Id)), v.v. .? – fmr

Trả lời

3

F # có hỗ trợ các loại vô danh không?

Như tôi biết - không. Nhưng có 2 cách có thể cho cách giải quyết:

  • tuples sử dụng (như bạn đang sử dụng)
  • loại hình sử dụng hồ sơ, nhưng trong trường hợp này, bạn sẽ cần phải xác định kỷ lục trước đó. Một cái gì đó như thế này:
type Book = 
    { 
     Id: int; 
     ParentId: int; 
     ParentAlias: string; 
     TagLine: string; 
     Title: string; 
     Visible: bool; 
     CreatedDate: DateTime; 
    } 

Và mã sử dụng dòng chí trông giống như:

... 
|> 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 
     }) 

More giải thích bạn có thể tìm thấy trong câu hỏi tương tự here

Cập nhật:

Ghi sử dụng các loại như đối với tôi là giải pháp thanh lịch hơn, NHƯNG có vẻ như nó không hoạt động với Entity Framework - F# -> Record with parameterless constructor?.

Vì vậy, theo Tomas Petricek câu trả lời - nó phải được khai báo loại rõ ràng với các tham số ít constructor và các thuộc tính cần thiết.