我发现自己正在做的一种解决方案(针对 MS SQL 2005/2008)。而且我不确定在所有情况下是否都适合只编写动态 sql 并使用 ExecuteQuery 方法针对数据上下文执行它。
例如,如果我有一个无界列表,我试图将其传递给查询以执行包含...
' Mock a list of values
Dim ids as New List(of Integer)
ids.Add(1)
ids.Add(2)
' ....
ids.Add(1234)
Dim indivs = (From c In context.Individuals _
Where ids.Contains(c.Id) _
Select c).ToList
我会修改此查询以创建一个 SQL 字符串,以便直接对数据库执行,就像这样......
Dim str As New Text.StringBuilder("")
Dim declareStmt as string = "declare @ids table (indivId int) " & vbcrlf)
For i As Integer = 0 To ids.Count - 1
str.Append("select " & ids(i).ToString() & " & vbcrlf)
If i < ids.Count Then
str.Append("union " & vbcrlf)
End If
Next
Dim selStatement As String = "select * From " & context.Mapping.GetTable(GetType(Individuals)).TableName & _
" indiv " & vbcrlf & _
" inner join @ids ids on indiv.id = ids.id"
Dim query = declareStmt & str.ToString & selStatement
Dim result = context.ExecuteQuery(of Individual)(query).ToList
因此,除非我编码的任何语法错误或错误(以上或多或少是伪代码且未经测试),否则以上将在 SQL 中生成一个表变量并针对所需表执行内部连接(本例中为个人)并避免使用“IN”语句。
希望能帮助别人!