AsQueryable()不使用Lightswitch返回自定义LINQ查询中所需的类型

时间:2013-01-28 08:25:41

标签: c# linq visual-studio-lightswitch

我正在使用Lightswitch构建我的应用程序,我遇到了以下问题。

在我的数据库中,我有三个表:

  • 文章
  • 提供商
  • ArticleProvider

文章和提供者具有多对多关系,因此需要联结表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>>

2 个答案:

答案 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匹配的所有文章。

注意:我自己没有测试过这段代码。但这个想法应该存在。