繁体   English   中英

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

[英]AsQueryable() does not return needed type in custom LINQ query using Lightswitch

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

您的问题是您在PreprocessQuery中,这是为了进一步过滤数据,而不添加其他内容。

如果您四处张望,就会有很多提及。

尝试此查询,看看是否可行:

partial void ArticleByProvider_PreprocessQuery(int? ProviderId, 
                                               ref IQueryable<Article> query)
{
     query.Where(art => art.ArticleProviders
                              .Any(artProv => artProv.Provider.Id == ProviderId));
}

这样做的目的是获得至少与提供者ID匹配的所有文章。

注意:我自己尚未测试此代码。 但是这个想法应该在那里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM