LINQ Lambda查询'select'不能与oData一起使用

时间:2012-03-14 20:01:31

标签: c# linq 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查询失败了?

3 个答案:

答案 0 :(得分:13)

OData不支持投射到属性 - 你可以解决这个问题:

var lambdaQuery = Titles
            .Where(t => t.ReleaseYear == 2007)
            .Select(x=> new { x.Name })
            .AsEnumerable()
            .Select(t => t.Name);

使用AsEnumerable()强制查询的最后部分在Linq-to-Objects上下文(而不是OData查询)中执行,其中投影工作正常。

答案 1 :(得分:6)

试试这个 - 它实际上与你的第一个相同:

// 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(); 

答案 2 :(得分:0)

使用给出的答案,我进行了一些测试,发现了一些有关执行时间的有趣事情:

// 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()'方法是带回所有属性值的实体,因此执行时间更长?