[英]LINQ Lambda query 'select' not working with oData
我目前正在嘗試了解LINQ的一些基礎知識。 我一直在使用LINQPad來查詢Netflix OData源。
資料來源: http : //odata.netflix.com/v2/Catalog/
在使用lambda查詢時,我似乎無法選擇單個屬性 - 理解查詢完美無缺。 我找到了一段代碼,使用Netflix oData源上的lambdas執行更復雜的查詢,這似乎適用於返回實體的一個屬性。
// works fine
var compQuery = from t in Titles
where t.ReleaseYear == 2007
select new { t.Name };
compQuery.Dump();
// fails: "Can only specify query options (orderby, where, take, skip) after last navigation."
var lambdaQuery = Titles
.Where(t => t.ReleaseYear == 2007)
.Select(t => t.Name);
lambdaQuery.Dump();
// works fine - found on SO.
var lambdaQuery2 = People
.Expand("TitlesActedIn")
.Where(p => p.Name == "George Lucas")
.First()
.TitlesActedIn.Select(t => t.ShortName);
lambdaQuery2.Dump();
當有人要求返回一個屬性時,有沒有人可以解釋為什么基本的lambda查詢失敗?
OData不支持投影到屬性 - 你可以解決這個問題:
var lambdaQuery = Titles
.Where(t => t.ReleaseYear == 2007)
.Select(x=> new { x.Name })
.AsEnumerable()
.Select(t => t.Name);
使用AsEnumerable()
強制查詢的最后部分在Linq-to-Objects上下文(而不是OData查詢)中執行,其中投影工作正常。
試試這個 - 它實際上相當於你的第一個:
// fails: "Can only specify query options (orderby, where, take, skip) after last navigation."
var lambdaQuery = Titles
.Where(t => t.ReleaseYear == 2007)
.Select(t => new { t.Name });
lambdaQuery.Dump();
使用給出的答案,我已經運行了一些測試,並發現了一些有關執行時間的有趣事項:
// Avg Execution Time: 5 seconds
var query1 = Titles
.Where(t => t.ReleaseYear == 2007)
.Select(t => new {t.Name});
query1.Dump();
// Avg Execution Time: 15 seconds
var query2 = Titles
.Where(t => t.ReleaseYear == 2007)
.AsEnumerable()
.Select(t => t.Name);
query2.Dump();
所以我認為在查詢1中只返回'Name'屬性是正確的嗎? 而在查詢2中,'AsEnumerable()'方法是帶回所有屬性值的實體,因此執行時間更長?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.