LINQ строгая типизация - PullRequest
1 голос
/ 08 января 2012

Я знаю, что LINQ должен автоматически возвращать строго типизированные наборы результатов.Однако когда я присоединяю ObjectDataSource к методу на основе LINQ (без явного возвращаемого типа), я не получаю доступ ни к одному из столбцов, определенных в LINQ.

Пример метода:

   <System.ComponentModel.DataObjectMethod(ComponentModel.DataObjectMethodType.Select)> _
    Public Function GetMarketClusterList() As IEnumerable(Of MarketCluster)
        Return From d In db.tblMarkets
               Select New MarketCluster With {.MarketCluster = d.MarketCluster}
               Distinct
    End Function

    Public Class MarketCluster
        Public MarketCluster As String
    End Class

РЕДАКТИРОВАТЬ Я изменил свой код, чтобы использовать явный тип и выбрать в него.По крайней мере, теперь я знаю тип возвращаемого значения, но это не помогает с первоначальной проблемой.Еще более странно, что с помощью отладчика я обнаружил, что если я выполняю

<% # Eval ("MarketCluser")%>, он завершается ошибкой и говорит: "Поле или свойство с именем MarketCluster не найдено в выбранном источнике данных.", но если я сделаю <% Container.DataItem.MarketCluser%>, это будет нормально!

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Просто укажите тип возвращаемого значения:

Public Function GetMarketClusterList() As IEnumerable(Of MarketCluster)
    Return From d In db.tblMarkets
           Select d.MarketCluster
           Distinct
End Function

(или используйте IQueryable вместо IEnumerable)

... при условии, что тип d.MarketCluster равен MarketCluster.

Тип возврата обязательный , если Option Strict в любом случае включен ... что говорит о том, что вы, вероятно, не получили его.Я настоятельно рекомендую вам включить Option Strict для вашего проекта независимо от того, используете ли вы LINQ или нет, если только вам не нужно позднее связывание и т. Д. (В этом случае я бы попытался ограничить его только этими местами).что нужно).

0 голосов
/ 15 января 2012

В сообщении об ошибке указана точная ошибка, я просто ее пропустил.Когда он сказал, что не может найти «свойство», это означает, что член класса называется «Свойство».Я изменил свой код на это, и теперь он работает отлично.

Private _MarketCluster As String
Public Property MarketCluster As String
    Get
       Return _MarketCluster
    End Get
    Set(value As String)
       _MarketCluster = value
    End Set
End Property
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...