Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态Linq查询问题_C#_Linq - Fatal编程技术网

C# 动态Linq查询问题

C# 动态Linq查询问题,c#,linq,C#,Linq,我正在尝试查询Netflix OData提要。我有以下查询在LinqPad中运行良好: from g in Genres from t in g.Titles where g.Name == "Horror" && t.AverageRating == 2 && t.ReleaseYear == 2004 select t 但是,当我把它移到我的Silverlight应用程序上时,用户选择要搜索的内容,这样我可能有也可能没有所有的参数。在这种情况下,我需要在运行

我正在尝试查询Netflix OData提要。我有以下查询在LinqPad中运行良好:

from g in Genres
from t in g.Titles
where g.Name == "Horror" && t.AverageRating == 2 && t.ReleaseYear == 2004
select t
但是,当我把它移到我的Silverlight应用程序上时,用户选择要搜索的内容,这样我可能有也可能没有所有的参数。在这种情况下,我需要在运行时构造查询。我查看了动态查询的内容,这将很好…我遇到的问题是,我需要一个初始的可接受的查询来附加到其中,但这不起作用:

from g in Genres
from t in g.Titles
select t;
如有任何其他想法,将不胜感激。
提前感谢

以旧式、非动态的方式添加过滤器怎么样

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 );
您不必使用动态查询语法执行此操作,但可以

您确实有两个查询正在进行,因此您可能应该这样构建它们。您可以一次完成所有操作,但无论哪种方式,您都需要在不同的位置使用两个特定的where子句,一个用于体裁,另一个用于标题。考虑下面的例子来模拟你的情况。

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; }
}
或者,如我的示例所示,将查询构建为一个使用另一个查询的查询


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

Anthony…以下是我最后所做的…感谢您的帮助IQueryable query=Context.Genres.AsQueryable()。其中(g=>g.Name==qp.Genre)。SelectMany(f=>f.Titles);如果(!string.IsNullOrEmpty(qp.Rating))qry=qry.Where(“平均值==@0”,Rating);如果(!string.IsNullOrEmpty(qp.Year))qry=qry.Where(“ReleaseYear=@0”,Year);
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);
}
var query = foos.AsQueryable().Where(fooSearchClause).SelectMany(f => f.Bars);
// later
query = query.Where(barSearchClause);