我正在尝试查询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应用程序上时,用户会选择要搜索的内容,所以我可能会也可能不会拥有所有的参数。在这种情况下,我需要在运行时构造查询。我已经看过了动态查询的东西,这会做fine...the的问题,我有一个问题是,我需要一个初始的可接受的查询追加,但这不是飞行:
from g in Genres
from t in g.Titles
select t;如有任何其他想法,我们将不胜感激。提前感谢
发布于 2010-04-22 12:32:14
您不必使用动态查询语法来执行此操作,但您可以这样做。
您确实有两个查询正在发生,所以您可能应该这样构建它们。您可以一次完成所有这些操作,但是您需要在不同的位置使用两个特定的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; }
}..。
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子句可以稍后添加。所以你可以这样做:
var query = foos.AsQueryable().Where(fooSearchClause).SelectMany(f => f.Bars);
// later
query = query.Where(barSearchClause);或者将查询构建为使用另一个查询,如我的示例所示。
无论如何,使用我提供的术语,遍历最终查询都会产生一个结果。更改任何一个搜索变量的内容都会导致查询产生不同的结果。
发布于 2010-04-22 11:47:08
用老式的、非动态的方式添加滤镜怎么样?
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 );https://stackoverflow.com/questions/2687916
复制相似问题