C# 动态Linq查询问题
我正在尝试查询Netflix OData提要。我有以下查询在LinqPad中运行良好: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应用程序上时,用户选择要搜索的内容,这样我可能有也可能没有所有的参数。在这种情况下,我需要在运行
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);