我正在使用f#来更新csv文件中的数据库,因此我正在使用Fsharp.Data它来解析它,它按预期运行良好,然后SqlProvider进行实际更新.
所以我list从我的csv中获取了一个项目,其中一个字段是我要更新的表的标识符.我来自ac LINQ#background 所以使用我可以这样做:
var results = context.MyTable.Where(m => myList.Contains(m.Identifier))
Run Code Online (Sandbox Code Playgroud)
这会给我一些我正在寻找的行.我试着这样做
query {
for m in ctx.Dbo.MyTable do
where (List.contains m.Identifier myList)
select m
}
Run Code Online (Sandbox Code Playgroud)
并在运行时收到此错误:
System.InvalidOperationException:类型的变量"M""FSharp.Data.Sql.Common.SqlEntity"从范围""引用,但它没有定义
在Microsoft.FSharp.Linq.RuntimeHelpers.LeafExpressionConverter.EvaluateQuotation(FSharpExpr E)
在微软.FSharp.Linq.QueryModule.EvalNonNestedInner(CanEliminate canElim,FSharpExpr queryProducingSequence)
在Microsoft.FSharp.Linq.QueryModule.clo@1727-1.Microsoft-FSharp-Linq-ForwardDeclarations-IQueryMethods-Execute [A,b](FSharpExpr`1 q)
at.$ FSI_0006.main @()
由于错误而停止
然后尝试以下
query {
for m in ctx.Dbo.MyTable do
for id in myList do
where (id = m.Identifier)
select m
}
Run Code Online (Sandbox Code Playgroud)
并在编译时得到这个:
myScript.fsx(291,30):错误FS0001:类型'字符串列表'与类型'System.Linq.IQueryable'不兼容
我确信这可以做到,我想知道我做错了什么
什么是正确的方法?
我认为这是明显错误的是什么?
我刚跟着Aaron回答,这就是我的代码现在的样子,至少是相关部分:
let ctx = Sql.GetDataContext();
let getZipCodes (zipcodes: string list) =
query {
for zc in ctx.CleanZipCodes do
for id in zipcodes do
where (id = zc.ZipCode)
select zc
}
|> Seq.toList
Run Code Online (Sandbox Code Playgroud)
现在我收到这个错误:
System.Data.EntityCommandExecutionException:执行命令定义时发生错误.有关详细信息,请参阅内部异常 --->
System.Data.SqlClient.SqlException:SQL语句的某些部分嵌套太深.重写查询或将其分解为较小的查询.在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection,Action'1 wrapCloseInAction)
在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose)
在System.Data.SqlClient.TdsParser .TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady),
位于System.Data的System.Data.SqlClient.SqlDataReader.get_MetaData()
处的System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
. SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader的DS,RunBehavior runBehavior,字符串resetOptionsString,布尔isInternal,布尔forDescribeParameterEncryption,布尔shouldCacheForAlwaysEncrypted)
在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,布尔异步,的Int32超时,任务和任务,布尔asy System.Data.SqlClient.SqlCommand.RunExecuteReader中的ncWrite,Boolean inRetry,SqlDataReader ds,Boolean describeParameterEncryptionRequest)
(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String方法,TaskCompletionSource'1完成,Int32超时,Task&task,Boolean&usedCache,Boolean asyncWrite ,布尔inRetry)
在System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,字符串方法)
在System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior行为,字符串方法)
在System.Data.EntityClient .EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)---内部异常堆栈跟踪结束---
在System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,的CommandBehavior行为)
在System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType](ObjectContext的上下文中,ObjectParameterCollection的parameterValues)
在System.Data.Objects.ObjectQuery'1. GetResults(Nullable'1 forMergeOption)在System.Data.Objects.ObjectQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator()
在Microsoft.FSharp.Collections.SeqModule.ToList [T](IEnumerable'1源)
在. $ @ FSI_0006.main()