1

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

似乎该字段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 回答