我正无忧无虑地试图通过f# linq创建一个"IN CLause“--但似乎无法理解。我尝试了两种选择:
将天数列表作为序列表达式的一部分进行迭代:
let getHistoricalQuotes (securityId:int) (days:string seq) =
let results =
Query.query <@ seq {
for day in days do
for sq in db.SecurityQuote do
if sq.SecurityId =?! securityId && sq.Day = day then
yield sq ;
} @> 还有一个List.exists条款:
let getHistoricalQuotes (securityId:int) (days:string list) =
let results =
Query.query <@ seq {
for sq in db.SecurityQuote do
if sq.SecurityId =?! securityId && List.exists (fun d -> d = sq.Day) days then
yield sq ;
} @>
results两人都给了我:
'Microsoft.FSharp.Core.FSharpFunc2[System.String,System.Boolean] ToFSharpFunc[String,Boolean](System.Converter2System.String,}={“方法System.SystemException System.Boolean”不支持转换到
。}
一如既往,谢谢你提前提供帮助.
改写为:
let getHistoricalQuotes (securityId:int) (days:string list) =
let results =
Query.query <@
Query.join
db.SecurityQuote
days
(fun sq -> if(sq.SecurityId =?! securityId) then sq.Day else "")
(fun d -> d)
(fun sq d -> sq) @>
results得到了这个例外:
System.Exception未被处理
查询中使用了以下结构,但F#to-LINQ查询翻译器未识别值("2010/01/04";"2010/02/01";"2010/03/01";"2010/04/01";"2010/05/03";"2010/06/01";"2010/07/01";"2010/08/02";"2010/09/01";"2010/10/01";"2010/11/01";"2010/12/01";"2010/01/29";"2010/02/26";"2010/03/31";"2010/04/30";"2010/05/31";"2010/06/30";"2010/07/30";"2010/08/31";"2010/09/30";"2010/10/29";"2010/11/30";"2010/12/31")检查允许查询的规范,并考虑将部分查询移出引号。
删除引号并没有导致错误--但是它生成了一个非常不正确的查询(从历史引号中删除selext*)
现在作弊,直到我回来解决问题-但至少我可以保持相同的签名,虽然我将在数据库。
let getHistoricalQuotes (securityId:int) (days:string list) =
let getQuote (day) =
Query.query <@ seq {
for sq in db.SecurityQuote do
if sq.SecurityId =?! securityId && sq.Day = day then
yield sq ;
} @> |> Seq.head
List.map (fun day -> getQuote day) days下面我试过这个
let getHistoricalQuotes (securityId:int) (days:string list) =
let results =
Query.query <@ seq {
for sq in db.SecurityQuote do
if sq.SecurityId =?! securityId && days.Contains(sq.Day) then
yield sq ;
} @>
results但它不编译
未定义字段、构造函数或成员“
”
最后-(谢谢你):
let getHistoricalQuotes (securityId:int) (days:string array) =
let results =
Query.query <@ seq {
for sq in db.SecurityQuote do
if sq.SecurityId =?! securityId && days.Contains(sq.Day) then
yield sq ;
} @>
results是的--你需要打开System.Linq --是那些扩展方法,还是部分扩展方法--它们必须是,
发布于 2010-11-05 20:59:28
它已经存在于Linq中,但与您所习惯的相反:
days.Contains(day)https://stackoverflow.com/questions/4109703
复制相似问题