使用F#查询实体框架的示例

Ale*_*ois 6 .net f# entity-framework

我正在寻找一个关于使用F#查询实体数据源的示例或教程.

老实说,我没有找到太多.你们有没有运气好吗?

Ale*_*ois 5

以下是我能够根据我在此博客上找到的内容拼凑而成的示例

open Microsoft.FSharp.Linq.QuotationEvaluation
open Microsoft.FSharp.Linq

let IsPermited (serviceName:string) =
  //Instantiate the Entity 
  let data = new BusModelContainer()

  //Build your query
  let services = Query.query <@ seq{ for service in data.ServiceSet do
                         service.Name.Equals(serviceName) && service.IsEnabled then
                               yield service } @>
  if Seq.is_empty services then 
    false
  else
    true
Run Code Online (Sandbox Code Playgroud)

以下是博客中的代码,向我展示了如何从实体中进行选择

  let db = new FSharpSampleDB(connString)  

  Query.query <@ seq { for c in db.Customers do  
                       if id = c.CustomerId then  
                          yield (new Customer(c.CustomerId, c.Name, c.Balance))}   
              |> Seq.hd @> :> ICustomer  
Run Code Online (Sandbox Code Playgroud)


Rm5*_*558 1

这里有大量的例子

返回记录类型

type T1 = {F1: int32; F2: string}
let q = query {
  for t in ctx.SomeTable do 
  select { F1 = t.F1
           F2 = t.F2 } 
};
Run Code Online (Sandbox Code Playgroud)

返回匿名类型,{| ... |},仍然存在一些错误,丑陋的解决方法是将 .ToList() 附加到表中。

let q = query {
  for t in ctx.SomeTable.ToList() do 
  select 
        {| F1 = t.F1
           F2 = t.F2 
        |} 
};
Run Code Online (Sandbox Code Playgroud)

更新 EF Core 中的记录

let obj = ctx.SomeTable.Where(fun t->t.ID = 123).Single()
obj.FieldX <- "new Value"
ctx.SaveChanges() |> ignore
Run Code Online (Sandbox Code Playgroud)