VB.NET中的lambda表达式......我做错了什么?

时间:2010-03-09 22:23:15

标签: vb.net lambda

当我运行这个C#代码时,没有问题...但是当我将它翻译成VB.NET时,它会编译但由于'CompareString'成员不被允许在表达式中...我觉得我很遗憾这里的关键......

private void PrintButton_Click(object sender, EventArgs e)
{
if (ListsListBox.SelectedIndex > -1)
{
    //Context
    using (ClientOM.ClientContext ctx =
        new ClientOM.ClientContext(UrlTextBox.Text))
    {
        //Get selected list
        string listTitle = ListsListBox.SelectedItem.ToString();
        ClientOM.Web site = ctx.Web;
        ctx.Load(site,
            s => s.Lists.Where(l => l.Title == listTitle));
        ctx.ExecuteQuery();

        ClientOM.List list = site.Lists[0];

        //Get fields for this list
        ctx.Load(list,
            l => l.Fields.Where(f => f.Hidden == false 
      && (f.CanBeDeleted == true || f.InternalName == "Title")));
        ctx.ExecuteQuery();

        //Get items for the list
     ClientOM.ListItemCollection listItems = list.GetItems(
      ClientOM.CamlQuery.CreateAllItemsQuery());
        ctx.Load(listItems);
        ctx.ExecuteQuery();

        // DOCUMENT CREATION CODE GOES HERE

    }

    MessageBox.Show("Document Created!");
}

}

但是在VB.NET代码中这个错误是由于ctx.Load()方法中不允许'CompareString'成员...

Private Sub PrintButton_Click(sender As Object, e As EventArgs)
    If ListsListBox.SelectedIndex > -1 Then
        'Context
        Using ctx As New ClientOM.ClientContext(UrlTextBox.Text)
            'Get selected list
            Dim listTitle As String = ListsListBox.SelectedItem.ToString()
            Dim site As ClientOM.Web = ctx.Web
            ctx.Load(site, Function(s) s.Lists.Where(Function(l) l.Title = listTitle))
            ctx.ExecuteQuery()

            Dim list As ClientOM.List = site.Lists(0)

            'Get fields for this list
            ctx.Load(list, Function(l) l.Fields.Where(Function(f) f.Hidden = False AndAlso (f.CanBeDeleted = True OrElse f.InternalName = "Title")))
            ctx.ExecuteQuery()

            'Get items for the list
            Dim listItems As ClientOM.ListItemCollection = list.GetItems(ClientOM.CamlQuery.CreateAllItemsQuery())
            ctx.Load(listItems)

            ' DOCUMENT CREATION CODE GOES HERE

            ctx.ExecuteQuery()
        End Using

        MessageBox.Show("Document Created!")
    End If
End Sub

2 个答案:

答案 0 :(得分:2)

这可能是因为VB正在使用它自己的比较运算符实现,而不是字符串类中的实现,因此Load方法不能使用该表达式。

尝试使用Equals方法:

ctx.Load(site, Function(s) s.Lists.Where(Function(l) l.Title.Equals(listTitle)))

如果这不起作用,LINQ中的eq运算符可用于表达式,但我必须查找VB语法。

答案 1 :(得分:1)

错误

  

未处理的例外情况:   Microsoft.SharePoint.Client.ClientRequestException:The   'CompareString'成员不能在表达式中使用。

使用通过比较操作查询SharePoint列表的LINQ VB.NET代码时出现

根据KB 2883454

  

这个问题的原因是在VB.NET中,表达式为:

s = "abc"
     

转换为表达式:

0 == Microsoft.VisualBasic.CompilerServices.Operators.CompareString(s, "abc", true)
     

支持

     

目前没有解决方法,但解决方法是   在C#.NET模块中编译上述逻辑并在VB.NET中使用它   代码。