2012-01-07 16 views
1

私はLINQが自動的に強く型付けされた結果セットを返すと思います。しかし、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 

EDIT。少なくとも私は戻り値の型を知っていますが、元の問題には役立ちません。もし私がそうであれば、私はデバッガで、もしそうならば、デバッガで、MarketClusterという名前のフィールドまたはプロパティが選択されたデータソースに見つかりませんでした。しかし、もし私が<%Container.DataItem.MarketCluser%>それはうまく動作します! d.MarketClusterのタイプはMarketClusterと仮定...

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

(又はIEnumerableの代わりIQueryableを使用)

+1

なぜ関数の戻り値の型を指定しないのですか? – Jan

+0

私はDistinctがあなたの期待することはしないと思います。 .MarketClusterを設定した文字列ではなく、参照で別名を呼び出しているリスト内のすべてのオブジェクトを構築しているので、参照はすべて一意になります –

+0

導入する代わりに単にIEnumerable(Of String)ラッパークラス? –

答えて

0

エラーメッセージには、正確なエラーが表示され、私はそれを逃したばかりです。それが「財産」を見つけることができないと言われたとき、それは「財産」と呼ばれるクラスメンバを意味しました。私はこれに私のコードを変更し、今は完全に動作します。

Private _MarketCluster As String 
Public Property MarketCluster As String 
    Get 
     Return _MarketCluster 
    End Get 
    Set(value As String) 
     _MarketCluster = value 
    End Set 
End Property 
2

は単に戻り型を指定します。

Option Strict場合は戻り値の型がを必要とするが、とにかく上にある...あなたはおそらくないはそれを持っていることを示唆しています。具体的にの遅延バインディングなどが必要な場合を除き、LINQを使用しているかどうかにかかわらず、あなたのプロジェクトにOption Strictを有効にすることを強くお勧めします(この場合、必要な場所にのみ制限しようとします)。

+0

戻り値の型はMarketClusterではなくIEnumerable(Of )です。どうすれば変更できますか? –

+0

@ just.another.programmer:それはなぜ匿名型になるのでしょうか? 'd.MarketCluster'を選択しているだけです...あなたの本当のクエリに匿名型のselect文がある場合は、そうしなければなりません - その時点で、あなたは*強く型付けされた方法。 –

+0

私が投稿したクエリは、私が自分のコードで持っている本当の正確なクエリです。 intellisenseを使用して戻り値の型をチェックすると、IQueryable(Of )であることがわかります。 –