在f#中使用IRepository接口

时间:2016-07-21 18:22:32

标签: f# c#-to-f# f#-3.0

我目前正在重写用c#编写的研究生项目到f#。

我对如何在f#中处理IRepository接口感到困惑。在c#中似乎微不足道,但f#并不像我所做的那样。

有问题的IRepository在myNameSpace.SolarSystem名称空间中定义。我确保将其包含在我的f#项目中。

以下是我的笔记:

f# - 无效使用接口类型&lt; - (let repo = IRepository<SolarSystem>()

open myNameSpace.SolarSystem

let searchCatalog = [| 8; 11; 31 |]

let repo = IRepository<SolarSystem>()

let ClassOfSolarSystems classOfStar = 
    repo.Query().Where(fun s -> s.SolarGroups.Any(fun c -> searchCatalog.Contains(classOfStar) ))

c# - 没有错误:

using myNameSpace.SolarSystem

private readonly int[]  searchCatalog = new int[] { 8, 11, 31 };

public IRepository<SolarSystem> Repo { get; set; }

public IEnumerable<SolarSystem> ClassOfSolarSystems(Int32 classOfStar)
{
    return Repo.Query()
    .Where(s => s.SolarGroups.Any(c =>   searchCatalog.Contains(classOfStar)));
}

我用尽了googlefu,找不到任何有意义的(至少对我而言)解决方案。

有没有办法在f#中使用IRepository接口?

谢谢!

2 个答案:

答案 0 :(得分:4)

您的F#行等同于此C#,因为关键字new隐含在F#中。

var repo = new IRepository<SolarSystem>()

C#编译器也不允许你这样做。此外,您的C#示例是一个属性,而在F#中它是一个值绑定。 To define properties in F# you need to use the member keyword.

编辑

我和编辑一起玩了一段时间,直到我发现编译器有点高兴的东西,想出了这个。

let ClassOfSolarSystems (repo : IRepository<SolarSystem>) classOfStar = 
    repo.Query()
    |> Seq.filter(fun s -> s.SolarGroups.Any(fun c -> searchCatalog.Contains(classOfStar) ))

我对你的LINQ表达式并没有太多麻烦,但你应该考虑改用F# Seq module

答案 1 :(得分:1)

写作时

let repo = IRepository<SolarSystem>()

你试图创建一个界面实例,你知道,这是不可能的。

只需创建一个带存储库和搜索参数的函数。

open SolarSystems
open System.Linq

type RepositoryFunctions =
    member this.ClassOfSolarSystems (repo:IRepository<SolarSystem>) (classOfStar:int32) =
                                       repo.Query().Where(fun s -> s.SolarGroups.Any(fun c -> searchCatalog.Contains(classOfStar) ))

所以,如果你不喜欢在F#中使用LINQ,你可以写:

open SolarSystems

type RepositoryFunctions =
    member this.ClassOfSolarSystems (repo:IRepository<SolarSystem>) (classOfStar:int32) =
                 let catalogContainsStar searchCatalog = searchCatalog.Contains(classOfStar)
                 let systemContainsStar solarSys = solarSys.SolarGroups.Any( catalogContainsStar )
                 let getAllWithStar = Seq.filter systemContainsStar
                 in
                   repo.Query() |> getAllWithStar