лямбда-выражения в VB.NET ... что я делаю не так? - PullRequest
3 голосов
/ 10 марта 2010

когда я запускаю этот код 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 ]

2 голосов
/ 10 марта 2010

Вероятно, это связано с тем, что VB использует собственную реализацию оператора сравнения, а не реализацию в строковом классе, поэтому выражение не может использоваться методом Load.

Попробуйте использовать метод Equals:

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

Если это не сработает, в LINQ есть оператор eq, который работает в выражениях, но для этого мне придется поискать синтаксис VB.

1 голос
/ 08 октября 2014

Ошибка

Необработанное исключение: Microsoft.SharePoint.Client.ClientRequestException: Член «CompareString» нельзя использовать в выражении.

происходит при использовании кода LINQ VB.NET, который запрашивает списки SharePoint с помощью операции сравнения.

Согласно KB 2883454 :

Причиной этой проблемы является то, что в VB.NET выражение:

s = "abc"

преобразуется в выражение:

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

, который не поддерживается кодом SharePoint.

В настоящее время нет исправления для этого, но обходной путь будет скомпилируйте вышеупомянутую логику в модуле C # .NET и используйте ее в своем VB.NET Код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...