1

JOIN を使用した LINQ クエリ (VB.NET) で単一のエンティティ クラス (「カテゴリ」) を返そうとしていますが、機能していません。次のいずれかの理由だと思います。

  • IEnumerable の結果セット (1 個中) を取得しています OR
  • 結合の最初のテーブルの列だけではありません

この無効な型キャスト例外が発生するため:

    Unable to cast object of type 'System.Data.Linq.DataQuery`1[category]' 
    to type 'category'.

これが私が望むことを行うSQLです(結合されたテーブルの列が必要ないことに注意してください):
      select subcat.*
      From category as cat
      join category as parentcat On cat.cat_id = cat.parent_cat_id
      Where parentcat.cat_url = 'dogs'
        And cat.cat_url = 'poodles'

LINQPadで動作するLINQコードは次のとおりです。

   dim q = From cat In categories _
        Join parentcat In categories On parentcat.cat_id Equals cat.parent_cat_id _
        Where parentcat.cat_url.ToLower = "dogs" _
              And cat.cat_url.ToLower = "poodles" _
            Select categories.SingleOrDefault(function(c) c.cat_id = cat.cat_id)
   q.dumb

しかし、これは VB.NET の「CategoryRepository」関数では機能しません。

        Public Function GetCategoryByURL(ByVal strCatURL As String, ByVal strSubCatURL As String) As category Implements ICategoryRepository.GetCategoryByURL
        Return From cat In db.categories _
                Join parentcat In db.categories On parentcat.cat_id Equals cat.parent_cat_id _
            Where parentcat.cat_url.ToLower = strCatURL.ToLower _
              And cat.cat_url.ToLower = strSubCatURL.ToLower _
            Select db.categories.SingleOrDefault(Function(C) C.cat_id = cat.cat_id)
        End Function

「カテゴリ」クラスの単一のインスタンスを返すようにするにはどうすればよいですか? (単一のインスタンスを返すこの同じ関数をオーバーロードしているため、そのようにする必要があります...そしてそれは機能します!) データベースが正しく、「プードル」カテゴリを返す必要があることを確認しました。

私はLINQを初めて使用するので、間違っていることが非常に明白であると確信しているので、助けていただければ幸いです!

4

1 に答える 1

1

カテゴリをクエリし、結果セットの各行のステートメントを返しますdb.categories.SingleOrDefault(Function(C) C.cat_id = cat.cat_id) IQueryable結果が0または1の場合でも、これは常に偶数です。SingleOrDefault()クエリ全体を実行する必要があります。

Dim query = From cat In db.categories _
            Join parentcat In db.categories On parentcat.cat_id
                                        Equals cat.parent_cat_id _
            Where parentcat.cat_url.ToLower = strCatURL.ToLower _
            And cat.cat_url.ToLower = strSubCatURL.ToLower _
            Select cat
Return query.SingleOrDefault()
于 2013-03-18T12:28:14.693 に答える