簡體   English   中英

LINQ Lambda查詢'select'不能與oData一起使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM