我正在使用Lightswitch构建我的应用程序,我遇到了以下问题。
在我的数据库中,我有三个表:
文章和提供者具有多对多关系,因此需要联结表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>>
答案 0 :(得分:1)
您的问题是您处于PreprocessQuery中 这是为了进一步过滤数据,而不是添加额外的数据。
如果你仔细观察一下,就会提到很多。
答案 1 :(得分:0)
尝试此查询,看看是否有效:
partial void ArticleByProvider_PreprocessQuery(int? ProviderId,
ref IQueryable<Article> query)
{
query.Where(art => art.ArticleProviders
.Any(artProv => artProv.Provider.Id == ProviderId));
}
我们的想法是获取至少与提供商ID匹配的所有文章。
注意:我自己没有测试过这段代码。但这个想法应该存在。