Lightswitchを使用してアプリケーションをビルドしていますが、次の問題があります。
私のデータベースには、次の3つのテーブルがあります。
- 記事
- プロバイダー
- ArticleProvider
ArticleとProviderは多対多の関係にあるため、ジャンクションテーブルArticleProviderが必要です。
ここで、ユーザーがプロバイダーを選択して、このプロバイダーに関連するすべての記事を表示できる画面がアプリケーションに必要です。
SQLを使用して、このようにします(123は選択したいProvider_Idです)。
SELECT *
FROM Article a
WHERE a.Id IN
(SELECT ap.Article_Id FROM ArticleProvider ap WHERE ap.Provider_Id=123)
Lightswitchアプリケーションで、データソースの[Articles]テーブルをクリックしてクエリを作成し、[AddQuery]を選択しました。パラメータを追加ProviderId
し、ソースコードエディタに切り替えてカスタムクエリを作成しました。
partial void ArticleByProvider_PreprocessQuery(int? ProviderId,
ref IQueryable<Article> query)
{
...
}
次に、Linqクエリの作成を開始しました。IQueryable<ArticleProvider>
それらでフィルタリングするにはクエリが必要だと思うので、次のことを試しました。
(from art in query select art.ProviderQuery).AsQueryable<ArticleProvider>()
しかし、これを試してみると、このタイプは変換できないというコンパイル時エラーが発生します。だから私はこれを試しました、そしてそれはうまくコンパイルされます:
(from art in query select art.ProviderQuery)
.AsQueryable<IDataServiceQueryable<ArticleProvider>>()
IQueryable apList
ただし、次のクエリで返されたものを使用する場合:
from ap in apList where ap.Provider.Id == 123 select ap.Article.Id
フィールドProvider
とArticle
が見つからないようです。また、Visual Studioのコード補完では、これらのフィールドは提案されません。データベースにない多くのメソッドとフィールドのみが提案されます。
どうすればこの問題を解決できますか?
キャストやのような他のメソッド呼び出しをいじっToList()
てみましたが、この時点では常に行き詰まります。LinqとC#は初めてです。よろしくお願いします。
編集:
私は以下を使用して最初のクエリのリターンタイプをチェックしました:
var temp = (from art in query select art.ProviderQuery).AsQueryable()
返されるタイプはSystem.Linq.IQueryable<Microsoft.LightSwitch.IDataServiceQueryable<LightSwitchApplication.ArticleProvider>>