Linq для лиц. GetPropety (name) .GetValue не распознается linq - PullRequest
1 голос
/ 20 апреля 2011

У меня есть список в форме xaml, который я привязал к свойству List (Of MyType).Я заполнил этот список примерно так:

Dim fields As List(Of CheckableFields) = New List(Of CheckableFields)

    Using context As ITIPEntities = New ITIPEntities()

        Try

            Dim propertyInfoList As List(Of PropertyInfo) = GetType(PC).GetProperties().ToList()

            For Each pI In propertyInfoList
                If (pI.PropertyType <> GetType(EntityState) _
                 And pI.PropertyType <> GetType(EntityKey) _
                 And pI.PropertyType <> GetType(EntityCollection(Of DiskDrive)) _
                 And pI.PropertyType <> GetType(EntityCollection(Of Memory)) _
                 And pI.PropertyType <> GetType(EntityCollection(Of Monitor)) _
                 And pI.PropertyType <> GetType(EntityCollection(Of Network)) _
                 And pI.PropertyType <> GetType(EntityCollection(Of Processor))) Then
                    fields.Add(New CheckableFields(pI.Name))
                End If
            Next

        Catch ex As Exception

        End Try

    End Using

Теперь я нахожусь в точке, где пользователь выбирает поля, которые он хочет включить в отчет, и мне нужно перебирать обязательные поля.Это мой запрос linq:

For Each checkedField In _requiredFields
                If checkedField.IsChecked Then
                    If checkedField.FieldData IsNot Nothing AndAlso checkedField.FieldData.Trim IsNot String.Empty Then
                        Dim fieldData As String = checkedField.FieldData
                        Dim name As String = checkedField.Name
                        lquery = From comp In lquery Where CType(comp.GetType.GetProperty(name).GetValue(comp, Nothing), String).ToUpper.Contains(fieldData.ToUpper) Select comp
                    End If
                End If
            Next

, который вызывает исключение, что linq не распознает метод GetValue.

Как получить значения свойств динамически?

Редактировать:

Я не мог найти способ сделать это с Linq to Entities, но я нашел способ без Linq, который работает для меня:

For Each field In _requiredFields
                If field.IsChecked Then
                    reportGenerator.AllFields.Add(field.Name)
                    If field.FieldData IsNot Nothing Then
                        For i As Integer = pcs.Count - 1 To 0 Step -1
                            Dim compPropertyValue As String = CType(pcs(i).GetType().GetProperty(field.Name).GetValue(pcs(i), Nothing), String).ToUpper()
                            If Not compPropertyValue.Contains(field.FieldData.ToUpper()) Then
                                pcs.RemoveAt(i)
                            End If
                        Next i
                    End If
                End If
            Next

1 Ответ

0 голосов
/ 27 апреля 2011

Эта конструкция не поддерживается в LINQ-to-Entities.Это спроектированное ограничение.
Попробуйте вместо этого использовать Entity SQL, как показано в следующем примере:
"SELECT VALUE comp From COMPs AS comp WHERE comp." & name & ".ToUpper().Contains(" & fieldData & ".ToUpper()"

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