2010-04-22 97 views
1

我试图查询Netflix OData提要。我有以下查询,在LinqPad正常工作:动态Linq查询问题

from g in Genres 
from t in g.Titles 
where g.Name == "Horror" && t.AverageRating == 2 && t.ReleaseYear == 2004 
select t 

但是,当我将它交给我的Silverlight应用程序,用户选择什么搜索,所以我可能会或可能不会有所有的则params的。既然如此,我需要在运行时构造查询。香港专业教育学院看着动态查询的东西,并且会做得很好......我有问题,我需要一个初始接受查询,追加到,这不飞:

from g in Genres 
from t in g.Titles 
select t; 

有任何其他想法会赞赏。 在此先感谢

回答

1

你不做到这一点使用动态查询语法,但你可以。

你真的有两个查询发生,所以你应该建立它们。你可以一次完成所有事情,但是你需要两种不同的地方条款,一种是流派,一种是标题。考虑下面的例子,模仿你的情况。

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以选择条失败,因为这要求查询为IQueryable<Bar>

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

var query = foos.AsQueryable().Where(fooSearchClause).SelectMany(f => f.Bars); 
// later 
query = query.Where(barSearchClause); 

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

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

+0

Anthony ...这是我最终做的....感谢您的帮助 IQueryable query = Context.Genres.AsQueryable()。其中​​(g => g.Name == qp.Genre) .SelectMany(f => f.Titles); \t \t \t if(!string.IsNullOrEmpty(qp.Rating)) qry = qry。Where(“AverageRating == @ 0”,rating); \t \t \t 如果(string.IsNullOrEmpty(qp.Year)!) QRY = qry.Where( “ReleaseYear == @ 0”,一年); – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/321744/">Alex</a></span> <span>2010-04-23 14:30:10</span> </small> </span> </p> </div> </div> </div> </div> </div> </article> <div> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="4319274062" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <article class="board-top-1 padding-top-10"> <div class="post-col vote-info"> <span class="count">1<i class="fa fa-thumbs-up"></i></span> </div> <div class="post-offset"> <div class="answer fmt"> <p>如何追加过滤旧式,非动态的方式?</p> <pre><code class="prettyprint-override">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); </code></pre> </div> <div class="post-info"> <div class="post-meta row"> <p class="text-secondary col-lg-6"> <span class="source"> <a rel="noopener" target="_blank" href="https://stackoverflow.com/q/2688108">来源</a> </span> </p> <p class="text-secondary col-lg-6"> <span class="float-right date"> <span>2010-04-22 03:47:08</span> </p> <p class="col-12"></p> <p class="col-12"></p></div> </div> </div> </article> </div> <div class="clearfix"> </div> <div class="relative-box"> <div class="relative">相关问题</div> <ul class="relative_list"> <li> 1. <a href="http://cn.voidcc.com/question/p-fgbwujxf-cv.html" target="_blank" title="动态LINQ到NHibernate的查询问题"> 动态LINQ到NHibernate的查询问题 </a> </li> <li> 2. <a href="http://cn.voidcc.com/question/p-qtpyaqcf-gw.html" target="_blank" title="简单LINQ的动态查询问题"> 简单LINQ的动态查询问题 </a> </li> <li> 3. <a href="http://cn.voidcc.com/question/p-hektfmaj-gd.html" target="_blank" title="动态LINQ查询"> 动态LINQ查询 </a> </li> <li> 4. <a href="http://cn.voidcc.com/question/p-pxhnposh-or.html" target="_blank" title="动态LINQ查询"> 动态LINQ查询 </a> </li> <li> 5. <a href="http://cn.voidcc.com/question/p-psxsvdhg-dw.html" target="_blank" title="LINQ动态查询"> LINQ动态查询 </a> </li> <li> 6. <a href="http://cn.voidcc.com/question/p-xcntwfkf-qr.html" target="_blank" title="动态LINQ查询"> 动态LINQ查询 </a> </li> <li> 7. <a href="http://cn.voidcc.com/question/p-tuddynsy-eg.html" target="_blank" title="动态LINQ查询"> 动态LINQ查询 </a> </li> <li> 8. <a href="http://cn.voidcc.com/question/p-edstyarg-gr.html" target="_blank" title="动态LINQ查询"> 动态LINQ查询 </a> </li> <li> 9. <a href="http://cn.voidcc.com/question/p-mwgwnfel-ec.html" target="_blank" title="Linq查询问题"> Linq查询问题 </a> </li> <li> 10. <a href="http://cn.voidcc.com/question/p-tvuchsqn-nn.html" target="_blank" title="LINQ查询问题"> LINQ查询问题 </a> </li> <li> 11. <a href="http://cn.voidcc.com/question/p-bhwgsyuw-vu.html" target="_blank" title="LINQ查询问题"> LINQ查询问题 </a> </li> <li> 12. <a href="http://cn.voidcc.com/question/p-ourqcmcf-ed.html" target="_blank" title="LINQ问题 - 查询"> LINQ问题 - 查询 </a> </li> <li> 13. <a href="http://cn.voidcc.com/question/p-cbdlgxrb-co.html" target="_blank" title="LINQ查询问题"> LINQ查询问题 </a> </li> <li> 14. <a href="http://cn.voidcc.com/question/p-udkxxsna-me.html" target="_blank" title="LINQ查询问题"> LINQ查询问题 </a> </li> <li> 15. <a href="http://cn.voidcc.com/question/p-epgjrdgi-nh.html" target="_blank" title="Linq查询问题"> Linq查询问题 </a> </li> <li> 16. <a href="http://cn.voidcc.com/question/p-dmxbvrpi-mv.html" target="_blank" title="LINQ查询问题"> LINQ查询问题 </a> </li> <li> 17. <a href="http://cn.voidcc.com/question/p-zaamvqgh-me.html" target="_blank" title="LINQ查询问题"> LINQ查询问题 </a> </li> <li> 18. <a href="http://cn.voidcc.com/question/p-evgfgymv-m.html" target="_blank" title="动态LINQ查询EF C#"> 动态LINQ查询EF C# </a> </li> <li> 19. <a href="http://cn.voidcc.com/question/p-ommbzdlf-eg.html" target="_blank" title="在SharePoint动态LINQ查询"> 在SharePoint动态LINQ查询 </a> </li> <li> 20. <a href="http://cn.voidcc.com/question/p-ztsqaahd-hz.html" target="_blank" title="LINQ动态查询库"> LINQ动态查询库 </a> </li> <li> 21. <a href="http://cn.voidcc.com/question/p-thlabpbu-na.html" target="_blank" title="复杂动态LINQ查询"> 复杂动态LINQ查询 </a> </li> <li> 22. <a href="http://cn.voidcc.com/question/p-czyujxyt-mb.html" target="_blank" title="创建动态LINQ查询"> 创建动态LINQ查询 </a> </li> <li> 23. <a href="http://cn.voidcc.com/question/p-ddevjvvb-t.html" target="_blank" title="动态创建linq查询"> 动态创建linq查询 </a> </li> <li> 24. <a href="http://cn.voidcc.com/question/p-fmdhmkuz-kb.html" target="_blank" title="Linq动态查询与组"> Linq动态查询与组 </a> </li> <li> 25. <a href="http://cn.voidcc.com/question/p-qvcefaew-mo.html" target="_blank" title="Linq 2 Sql动态查询"> Linq 2 Sql动态查询 </a> </li> <li> 26. <a href="http://cn.voidcc.com/question/p-oiucxhnv-sx.html" target="_blank" title="LINQ中的动态查询"> LINQ中的动态查询 </a> </li> <li> 27. <a href="http://cn.voidcc.com/question/p-grtqqfcj-vd.html" target="_blank" title="动态Linq查询帮助?"> 动态Linq查询帮助? </a> </li> <li> 28. <a href="http://cn.voidcc.com/question/p-bhqedkgb-ts.html" target="_blank" title="动态LINQ表达式查询,得到问题"> 动态LINQ表达式查询,得到问题 </a> </li> <li> 29. <a href="http://cn.voidcc.com/question/p-wowifovm-gh.html" target="_blank" title="缓存Linq查询问题"> 缓存Linq查询问题 </a> </li> <li> 30. <a href="http://cn.voidcc.com/question/p-kdxidqvq-mv.html" target="_blank" title="Linq到LLBLGen查询问题"> Linq到LLBLGen查询问题 </a> </li> </ul> </div> <div> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6208739752673518" data-ad-slot="3534119089"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img2.voidcc.com/voidso/script/side.js?t=1652515421853"></script> <script type="text/javascript" src="http://img2.voidcc.com/voidso/plugin/highlight/highlight.pack.js"></script> <link href="http://img2.voidcc.com/voidso/plugin/highlight/styles/docco.css" media="screen" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $('pre').each(function(i, e) { hljs.highlightBlock(e, "<span class='indent'> </span>", false) }); </script> <div class="col-lg-3 col-md-4 col-sm-5"> <div id="rightTop"> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> 每日一句 </div> <div class="panel-body m-b-sm m-t-sm clearfix"> 每一个你不满意的现在,都有一个你没有努力的曾经。 </div> </div> <div class="row"> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- VOIDCC问答侧边栏广告 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="3862022848" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> 最新问题 </div> <div class="m-b-sm m-t-sm clearfix"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://cn.voidcc.com/question/p-khckgrzc-bmn.html" target="_blank" title="自定义地图框Geocoder控件"> 自定义地图框Geocoder控件 </a> </li> <li class="side_article_list_item"> 2. <a href="http://cn.voidcc.com/question/p-fawtgxyr-bnh.html" target="_blank" title="Java-错误:无法找到或加载主类"> Java-错误:无法找到或加载主类 </a> </li> <li class="side_article_list_item"> 3. <a href="http://cn.voidcc.com/question/p-bnjkmuml-bmt.html" target="_blank" title="默认情况下如何在`bash` shell中过滤掉无用的消息?"> 默认情况下如何在`bash` shell中过滤掉无用的消息? </a> </li> <li class="side_article_list_item"> 4. <a href="http://cn.voidcc.com/question/p-ximaoggj-vg.html" target="_blank" title="openapi v3响应正文中的多行示例"> openapi v3响应正文中的多行示例 </a> </li> <li class="side_article_list_item"> 5. <a href="http://cn.voidcc.com/question/p-oystnmon-vg.html" target="_blank" title="Python 3.6.3 urlopen从URI中删除服务器名称以存储在远程服务器上的html文件"> Python 3.6.3 urlopen从URI中删除服务器名称以存储在远程服务器上的html文件 </a> </li> <li class="side_article_list_item"> 6. <a href="http://cn.voidcc.com/question/p-bwmetmxg-vk.html" target="_blank" title="8位内联汇编大小不匹配旋转"> 8位内联汇编大小不匹配旋转 </a> </li> <li class="side_article_list_item"> 7. <a href="http://cn.voidcc.com/question/p-awfxdpsy-vk.html" target="_blank" title="将字符串数组从WWW转换为Unity3d中的类列表"> 将字符串数组从WWW转换为Unity3d中的类列表 </a> </li> <li class="side_article_list_item"> 8. <a href="http://cn.voidcc.com/question/p-zlapgcsu-vh.html" target="_blank" title="按钮上的颜色随时变化"> 按钮上的颜色随时变化 </a> </li> <li class="side_article_list_item"> 9. <a href="http://cn.voidcc.com/question/p-wlmhtzci-bnq.html" target="_blank" title="如何在用户卸载应用程序时重新备份数据并重新安装应用程序所有数据恢复"> 如何在用户卸载应用程序时重新备份数据并重新安装应用程序所有数据恢复 </a> </li> <li class="side_article_list_item"> 10. <a href="http://cn.voidcc.com/question/p-tkisurxk-bnw.html" target="_blank" title="链接列表添加功能不按预期工作"> 链接列表添加功能不按预期工作 </a> </li> </ul> </div> </div> </div> <p class="article-nav-bar"></p> <div class="row sidebar article-nav"> <div class="row box_white visible-sm visible-md visible-lg margin-zero"> <div class="top"> <h3 class="title"><i class="glyphicon glyphicon-th-list"></i> 相关问题</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://cn.voidcc.com/question/p-fgbwujxf-cv.html" target="_blank" title="动态LINQ到NHibernate的查询问题"> 动态LINQ到NHibernate的查询问题 </a> </li> <li class="side_article_list_item"> 2. <a href="http://cn.voidcc.com/question/p-qtpyaqcf-gw.html" target="_blank" title="简单LINQ的动态查询问题"> 简单LINQ的动态查询问题 </a> </li> <li class="side_article_list_item"> 3. <a href="http://cn.voidcc.com/question/p-hektfmaj-gd.html" target="_blank" title="动态LINQ查询"> 动态LINQ查询 </a> </li> <li class="side_article_list_item"> 4. <a href="http://cn.voidcc.com/question/p-pxhnposh-or.html" target="_blank" title="动态LINQ查询"> 动态LINQ查询 </a> </li> <li class="side_article_list_item"> 5. <a href="http://cn.voidcc.com/question/p-psxsvdhg-dw.html" target="_blank" title="LINQ动态查询"> LINQ动态查询 </a> </li> <li class="side_article_list_item"> 6. <a href="http://cn.voidcc.com/question/p-xcntwfkf-qr.html" target="_blank" title="动态LINQ查询"> 动态LINQ查询 </a> </li> <li class="side_article_list_item"> 7. <a href="http://cn.voidcc.com/question/p-tuddynsy-eg.html" target="_blank" title="动态LINQ查询"> 动态LINQ查询 </a> </li> <li class="side_article_list_item"> 8. <a href="http://cn.voidcc.com/question/p-edstyarg-gr.html" target="_blank" title="动态LINQ查询"> 动态LINQ查询 </a> </li> <li class="side_article_list_item"> 9. <a href="http://cn.voidcc.com/question/p-mwgwnfel-ec.html" target="_blank" title="Linq查询问题"> Linq查询问题 </a> </li> <li class="side_article_list_item"> 10. <a href="http://cn.voidcc.com/question/p-tvuchsqn-nn.html" target="_blank" title="LINQ查询问题"> LINQ查询问题 </a> </li> </ul> </div> </div> </div> </div> </div> </div> </div><!-- wrap end--> <!-- footer --> <footer id="footer"> <div class="bg-simple lt"> <div class="container"> <div class="row padder-v m-t"> <div class="col-xs-8"> <ul class="list-inline"> <li><a href="http://cn.voidcc.com/contact">联系我们</a></li> <li>© 2020 CN.VOIDCC.COM</li> <li><a rel="nofollow" href="https://beian.miit.gov.cn/" target="_blank">沪ICP备13005482号-13</a></li> <li><script type="text/javascript" src="https://s9.cnzz.com/z_stat.php?id=1280098168&web_id=1280098168"></script></li> <li><a href="http://cn.voidcc.com/" target="_blank" title="程序问答园区">简体中文</a></li> <li><a href="http://hk.voidcc.com/" target="_blank" title="程序問答園區">繁體中文</a></li> <li><a href="http://ru.voidcc.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.voidcc.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.voidcc.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.voidcc.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.voidcc.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.voidcc.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.voidcc.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.voidcc.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.voidcc.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.voidcc.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.voidcc.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-77509369-5"></script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'UA-77509369-5'); </script> <script> var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?67d4731349f0b00136755b80364ce381"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>