首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态Linq查询问题

动态Linq查询问题
EN

Stack Overflow用户
提问于 2010-04-22 10:40:19
回答 2查看 223关注 0票数 1

我正在尝试查询Netflix的OData订阅源。我有以下在LinqPad中运行良好的查询:

代码语言:javascript
运行
复制
from g in Genres
from t in g.Titles
where g.Name == "Horror" && t.AverageRating == 2 && t.ReleaseYear == 2004
select t

但是,当我把它移到我的Silverlight应用程序上时,用户会选择要搜索的内容,所以我可能会也可能不会拥有所有的参数。在这种情况下,我需要在运行时构造查询。我已经看过了动态查询的东西,这会做fine...the的问题,我有一个问题是,我需要一个初始的可接受的查询追加,但这不是飞行:

代码语言:javascript
运行
复制
from g in Genres
from t in g.Titles
select t;

如有任何其他想法,我们将不胜感激。提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-22 12:32:14

您不必使用动态查询语法来执行此操作,但您可以这样做。

您确实有两个查询正在发生,所以您可能应该这样构建它们。您可以一次完成所有这些操作,但是您需要在不同的位置使用两个特定的where子句,一个用于流派,另一个用于标题。考虑以下模拟您的情况的示例。

代码语言:javascript
运行
复制
class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Bar> Bars { get; set; }
}

class Bar
{
    public string Color { get; set; }
}

..。

代码语言:javascript
运行
复制
List<Foo> foos = new List<Foo>()
{
    new Foo() { Id = 1, Name = "Apple", Bars = new List<Bar> () { new Bar() { Color = "Red"}, new Bar() { Color="Green"}} },
    new Foo() { Id = 2, Name = "Orange", Bars = new List<Bar> () { new Bar() { Color = "Orange"},new Bar() { Color="Red Orange"}} },
    new Foo() { Id = 3, Name = "Banana",Bars = new List<Bar> () { new Bar() { Color = "Yellow"},new Bar() { Color="Green"}} },
    new Foo() { Id = 4, Name = "Pear",Bars = new List<Bar> () { new Bar() { Color = "Green"},new Bar() { Color="Yellow"}} }
};

string fooName = "Apple";
string barColor = "Green";

var fooQuery = foos.AsQueryable();

if (!string.IsNullOrEmpty(fooName))
{
    string filter = string.Format("Name = \"{0}\"", fooName);
    fooQuery = fooQuery.Where(filter);
}

var barQuery = fooQuery.SelectMany(f => f.Bars);

if (!string.IsNullOrEmpty(barColor))
{
    string filter = string.Format("Color = \"{0}\"", barColor);
    barQuery = barQuery.Where(filter);
}

第一件事是它为Foos构建了一个查询。如果需要过滤(基于fooSearchName变量),它会生成一个Where子句并将其添加到查询中。之后,它将成为返回Bar元素的查询的基础。同样,如果需要过滤,将生成Where子句并将其添加到查询中。

不幸的是,您不能在步骤中构建单个查询,因为在第一步中会计算类型推断。如果要输入var query = foos.AsQueryable();,则查询的计算结果为IQueryable<Foo>,因此在后面的语句中添加SelectMany以选择Bars将失败,因为这要求该查询为IQueryable<Bar>

在这种情况下,您的手是被迫的,您必须一次构建所有查询,或者至少构建到包括SelectMany的部分,最后的Where子句可以稍后添加。所以你可以这样做:

代码语言:javascript
运行
复制
var query = foos.AsQueryable().Where(fooSearchClause).SelectMany(f => f.Bars);
// later
query = query.Where(barSearchClause);

或者将查询构建为使用另一个查询,如我的示例所示。

无论如何,使用我提供的术语,遍历最终查询都会产生一个结果。更改任何一个搜索变量的内容都会导致查询产生不同的结果。

票数 1
EN

Stack Overflow用户

发布于 2010-04-22 11:47:08

用老式的、非动态的方式添加滤镜怎么样?

代码语言:javascript
运行
复制
var genresQuery = from g in Genres select g;
if ( !string.IsNullOrEmpty( name ) ) genresQuery = genresQuery.Where( g => g.Name == name );

var titlesQuery = from t in genresQuery select t;
if ( !string.IsNullOrEmpty( rating ) ) titlesQuery = titlesQuery.Where( t => t.AverageRating == rating );
if ( !string.IsNullOrEmpty( year ) ) titlesQuery = titlesQuery.Where( t => t.ReleaseYear == year );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2687916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档