1

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

フィールドProviderArticleが見つからないようです。また、Visual Studioのコード補完では、これらのフィールドは提案されません。データベースにない多くのメソッドとフィールドのみが提案されます。

どうすればこの問題を解決できますか?

キャストやのような他のメソッド呼び出しをいじっToList()てみましたが、この時点では常に行き詰まります。LinqとC#は初めてです。よろしくお願いします。


編集: 私は以下を使用して最初のクエリのリターンタイプをチェックしました: var temp = (from art in query select art.ProviderQuery).AsQueryable()

返されるタイプはSystem.Linq.IQueryable<Microsoft.LightSwitch.IDataServiceQueryable<LightSwitchApplication.ArticleProvider>>

4

2 に答える 2

1

問題は、PreprocessQueryにいることです。これは、データをさらにフィルタリングするためのものであり、余分なものを追加するためのものではありません。

少し見回すと、これはたくさん言及されています。

于 2013-01-29T11:34:45.350 に答える
0

このクエリを試して、これが機能するかどうかを確認してください。

partial void ArticleByProvider_PreprocessQuery(int? ProviderId, 
                                               ref IQueryable<Article> query)
{
     query.Where(art => art.ArticleProviders
                              .Any(artProv => artProv.Provider.Id == ProviderId));
}

アイデアは、少なくともプロバイダー ID に一致するすべての記事を取得することです。

注: このコードは自分でテストしていません。しかし、アイデアはそこにあるはずです。

于 2013-01-29T01:06:17.807 に答える