我正在使用 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>>