2009-08-25 9 views
2

に参加し、私はdocs亜音速3 LINQのはlinqtemplatesを使用して問題

 var query = from c in db.CountyLookups 
        join s in db.StateLookUps on 
        c.StateLookupID equals 
        s.StateLookupID 
        where c.Name2 == countyName && 
        s.Abbr == stateAbbr 
        select new 
        { 
         Latitude = c.Latitude, 
         Longitude = c.Longitude 
        }; 

     var result = query.SingleOrDefault(); 

にあるものに近いLINQ構文を取得しようとしたが、.SingleOrDefault()が呼び出されたときに、私が言うくその黄色の画面を取得します:

System.NotSupportedException:メンバー 'StateLookupID' は

サポートされていませんスタックトレースがで終わる:

SubSonic.Linq.Structure.TSqlFormatter.VisitMemberAccess(MemberExpression m) 

StateLookupID列にはデータベースにアンダースコアがあり、通常のint pk/fkです。

何が間違っていますか?

+0

どのデータ型がStateLookupIDですか?整数? –

+0

subsonicproject @ googlegroupsにメールを送ることができれば、私はそれを設定してスピルンクすることができます。私は単体テストを見ており、これ以上のことをしています。 –

+0

hmmz、Classes.csには、これらの型に対して定義された外部キーはありませんが、何か意味がありますか? StateLookupIDは両方のintです。私はスキーマをエクスポートします。あなたの助けのためにthx、ロブ! – ChrisPelatari

答えて

2

明らかにVisitMemberAccessは、int、唯一の文字列とdatetime(SubSonic.Linq.Structure.TSqlFormatterの152行目から)で何をすべきかわかりません。私はなぜこれが結合で呼び出されるのかわかりません、なぜなら結合は通常int pk/fk(またはあなたが好きならguid)の間にあるからです。

私はSubSonic.Query.Selectのためにlinqクエリを廃止しました。

 var query = db.Select.From<CountyLookup>() 
      .InnerJoin<StateLookUp>() 
      .Where(CountyLookupTable.Name2Column) 
      .IsEqualTo(countyName) 
      .And(StateLookUpTable.AbbrColumn) 
      .IsEqualTo(stateAbbr); 

次に、ExecuteTypedListを呼び出して結果をモデルクラスにマップします。 buttahのように動作します。この場合、linqを使いたかっただけです。

+0

このスレッドを見ているのを見てきました。私はGUIDを使用するときに同じエラーが発生していると思います。ありがとう –

0

モデルにプロパティを追加したときにこのエラーが発生しました(ASP.Net MVC 1.0、感謝Robに記載されているIsValidプロパティ)。 私はこの問題を少しでも解消しましたが、TSQLではなくコードで実行する必要のあるクエリを作成しようとするクエリビルダーに任せていると思います。

SQLを生成しようとすると、VisitMemberAccessの複雑な型(おそらく別のモデル)でVisitMemberAccess経由でTSQLを生成するためのパスが降りますが、それはVisitMemberAccessのdatetimeと文字列に対して操作を実行する方法しか知りません。これは少し矛盾している場合は申し訳ありませんが、私はそれの周りに私の頭を取得しようとしています。

これを回避するには、TSQL生成を行う操作の前にLinqKit AsExpandableのようなものを使用することを検討してください。私はBANGになっていた単純なOrderByでこれを試しました。それは動作するように見えますが、パフォーマンスに何が影響するかはまだ分かりません。実際

0

私は

Stuff.All()を実行して私の問題の問題を克服し、そのバックを取る。ここで、(X => x.Someid == ID).ToArray() .AsQueryable() .Where (x => x.SomeProp.SomeFlag == true);

これは酷いですが動作します。

0

これはまだ問題があるようです。即ちなどの単純なケースでは、(この場合)言語であるように、同じVisitMemberAccess関数内失敗

SELECT Language.* FROM Language LEFT JOIN SiteConfigLanguage ON Language.Code = SiteConfigLanguage.LanguageCode; 

var list = from lang in db.Languages 
         join site in db.SiteConfigLanguages on 
         lang.Code equals site.LanguageCode 
         select lang; 

これは、単純なSQL(この例では無意味であるが)に評価すべきです認識可能な宣言型(StringまたはDateTime)ではありません。これは、上記の@matwareの記述と非常によく似ていますが、 "IsValid"メンバは純粋なC#コードであるように見えますが、この場合はlang.Codeは単にデータベースの列への参照です。

私は現在、問題のあるLINQクエリの一部であるため、回避策を検討中です。私が何かを見つけたら、ここにそれを掲示するでしょう。それ以外の場合は、この問題の他の解決策または回避策が知られていますか?

更新:ここを無視してください。これは単純にLINQ文に単純な行がないためです。あなたは物事を完了するために "に"キーワードを使用することを確認する必要があります!

すなわち

var list = from lang in db.Languages 
       join site in db.SiteConfigLanguages on 
       lang.Code equals site.LanguageCode into sl 
       from siteLang in sl.DefaultIfEmpty() 
       select lang; 

私は別のエラーあなたの心を持っているが、少なくとも、この特定の例外が解決されます。次のコードは残念なことに(System.Linqライブラリの中で)ちょっと変わっています。