我正在使用Lightswitch来构建我的应用程序,但我有以下问题。
在我的数据库中,我有三个表:
- 品
- 供应商
- 文章提供者
和提供程序具有多对多关系,因此需要联结表文章提供程序。
现在,我想要在我的应用程序中有一个屏幕,用户可以在其中选择一个提供程序并查看与此提供程序相关的所有文章。
使用 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的代码完成并不建议这些字段,只有许多方法和字段不在我的数据库中。
如何解决这个问题?
我玩过 cast 和其他方法调用,如 ToList()
,但我总是卡在这一点上。我是 Linq 和 C# 的新手。提前感谢您的任何帮助。
编辑:我使用以下方法检查了第一个查询的返回类型: var temp = (from art in query select art.ProviderQuery).AsQueryable()
返回的类型为 System.Linq.IQueryable<Microsoft.LightSwitch.IDataServiceQueryable<LightSwitchApplication.ArticleProvider>>
你的问题是你在PreprocessQuery中这是为了进一步过滤数据,而不是添加额外的数据。
如果你环顾四周,这被提到了很多。
尝试一下这个查询,看看这是否有效:
partial void ArticleByProvider_PreprocessQuery(int? ProviderId,
ref IQueryable<Article> query)
{
query.Where(art => art.ArticleProviders
.Any(artProv => artProv.Provider.Id == ProviderId));
}
这个想法是获取至少与提供程序 ID 匹配的所有文章。
注意:我自己还没有测试过这段代码。但这个想法应该在那里。