首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FLinq SQL "IN Clause“

FLinq SQL "IN Clause“
EN

Stack Overflow用户
提问于 2010-11-05 20:19:32
回答 1查看 415关注 0票数 3

我正无忧无虑地试图通过f# linq创建一个"IN CLause“--但似乎无法理解。我尝试了两种选择:

将天数列表作为序列表达式的一部分进行迭代:

代码语言:javascript
复制
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条款:

代码语言:javascript
复制
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”不支持转换到

。}

一如既往,谢谢你提前提供帮助.

改写为:

代码语言:javascript
复制
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*)

现在作弊,直到我回来解决问题-但至少我可以保持相同的签名,虽然我将在数据库。

代码语言:javascript
复制
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

下面我试过这个

代码语言:javascript
复制
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

但它不编译

未定义字段、构造函数或成员“

最后-(谢谢你):

代码语言:javascript
复制
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 --是那些扩展方法,还是部分扩展方法--它们必须是,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-05 20:59:28

它已经存在于Linq中,但与您所习惯的相反:

代码语言:javascript
复制
days.Contains(day)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4109703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档