我正在使用 Lightswitch 构建我的应用程序,但遇到以下问题。
在我的数据库中,我有三个表:
- 文章
 - 提供者
 - 文章提供者
 
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 应用程序中,我通过单击数据源中的“文章”表并选择“添加查询”来创建一个查询。我添加了一个参数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>>