
[英]Using LINQ Dynamic Query Library with Dictionary<string, object> and .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
似乎找不到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>>
您的问题是您在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.