只需尝试F#3.0,就多列分组而言,只需要花一点时间.显而易见的是
query {
for d in context.table do
groupBy (d.col1,d.col2) into g
select (g.Key)
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了"LINQ to Entities中只支持无参数构造函数和初始值设定项".例外.
我似乎无法在msdn上找到一个例子
http://msdn.microsoft.com/en-us/library/hh225374(v=vs.110).aspx
http://msdn.microsoft.com/en-us/library/hh361035(v=vs.110).aspx
而且我意识到我的问题类似于" F#中的实体框架和匿名类型 ",但它似乎是专注于powerpack/F#2.x而且我希望F#3.0有一个优雅的答案......任何想法?
更新:
我在阅读Brian的帖子时遇到了CLIMutable属性:
http://blogs.msdn.com/b/fsharpteam/archive/2012/07/19/more-about-fsharp-3.0-language-features.aspx
我很乐观,所以我试过了
[<CLIMutable>]
type MyRecord = { Column1 : int; Column2 : int }
query {
for d in context.table do
groupBy {Column1 = col1; Column2 = col2} into g
select (g.Key)
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我得到完全相同的例外.
考虑:
> Unchecked.defaultof<list<int>>;;
val it : int list = null
> 2 :: 1 :: Unchecked.defaultof<list<int>>;;
val it : int list = [2]
Run Code Online (Sandbox Code Playgroud)
这种行为背后的原因是什么?我希望最终列表为[2; 1]或引发异常.
我在远程xsd文件上使用xsd.exe来生成一些C#类定义.一种类型定义为
<xs:element name="amount">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
当我尝试反序列化xml文件时,我收到错误:
There is an error in XML document (30, 12). ---> System.FormatException: Input string was not in a correct format.
Run Code Online (Sandbox Code Playgroud)
只有当逗号用作分组分隔符(即87,000)时才会出现这种情况.如果我通过并删除逗号,无论何处出现错误,反序列化都可以正常工作.
我可以对xsd进行一些修改以允许逗号分组吗?或者更好的方法是在我的代码中允许它?尝试使用逗号解析我的代码中的小数点工作正常,它只是不喜欢它在xml文件中.
我有一堆导出IModule接口的模块.所以在主程序中我没有问题
...
let mutable modules = Seq.empty
[<ImportMany>]
member x.Modules
with get():IEnumerable<Lazy<IModule, IModuleData>> = modules
and set(a) = modules <- a
...
Run Code Online (Sandbox Code Playgroud)
但是现在我需要将一个接口公开给那些模块.因此每个模块都将导入一个接口
...
let mutable parent:IParent = ?
[<Import>]
member x.Parent
with get():IParent = parent
and set(a) = parent <- a
...
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,当我没有初始值时,如何创建我的可变"父"?此外,这是将API公开回组件部分的适当方法吗?