Linq查询错误

Linq查询错误,linq,wcf-data-services,linqpad,Linq,Wcf Data Services,Linqpad,我正在使用以下Linq查询: from p in People where p.Name == "George Lucas" select p.TitlesActedIn 其中TitlesActedIn是一个列表。人物和头衔是相互关联的 但我得到了一个错误: InvalidCastException:无法将“System.Linq.Expressions.PropertyExpression”类型的对象强制转换为“System.Data.Services.Client.ResourceExp

我正在使用以下Linq查询:

from p in People
 where p.Name == "George Lucas"
select p.TitlesActedIn
其中TitlesActedIn是一个列表。人物和头衔是相互关联的

但我得到了一个错误:

InvalidCastException:无法将“System.Linq.Expressions.PropertyExpression”类型的对象强制转换为“System.Data.Services.Client.ResourceExpression”类型

请建议解决方案。

更新:请参阅此以了解Data Services+另一个基于$expand的解决方案中选择多个的限制(注意,这需要服务器支持expand)

如果这是WCF数据服务,那么标题ActedIn是相关电影的集合。 只有当Person.Name是主键时,才能在一个查询中执行此操作

为了说明这一点:

var titles = from p in people
             where p.Name == "George Lucas"
             from m in p.TitlesActedIn
             select m;
将执行您想要的操作,但仅当名称是Person实体的键时,否则不支持此操作

如果名称不是关键,那么(今天)的一种方法是使用两个查询,如下所示:

var key = (from p in people
          where p.Name == "George Lucas"
          select new {p.Id}).Single().Id;

var titles = from p in people
             where p.Id == key
             from m in p.TitlesActedIn
             select m;
但另一种选择是进行扩展:

var george = (from p in people.Expand("TitlesActedIn")
             where p.Name == "George Lucas"
             select p).Single();

var titles = george.TitlesActedIn;
但这取决于服务器支持$expand-并非所有服务器都支持

注意:我们目前正在添加和WCF数据服务,一旦发布,您将能够编写:

var titles = from t in titles
             where t.Actors.Any(a => a.Name == "George Lucas")
             select t;
希望这有帮助


注意:在获取George Lucas密钥的代码中,我创建了一个匿名类型,因为现在WCF数据服务不支持直接实现原语。

一种非常简单的方法:

var query = People
    .Expand("TitlesActedIn")
    .Where(p => p.Name == "George Lucas")
    .First()
    .TitlesActedIn.Select(t => t.ShortName);              
query.Dump();
重要的是要注意,如果您传递的名称不存在,它将崩溃。(第一个运算符将引发异常。您需要保证名称存在,或者分两步执行


如果你想一步到位,可以归结为:(请注意后面的内容)

您需要展开,否则它将在
.First()
之后退出计算,因为titleActedIn将为空

它基本上转换为选择人,包括(扩展)关联中的titleActedIn,然后选择名称(客户端)

这样做的缺点是,您正在从Titles表中提取所有内容(所有字段)。因此,对于与返回的人相关的每个标题(标题、年份、描述、简称等)


如果您在两个查询中都这样做了,那么您只能从TitleActedin association中提取“ShortName”。

有趣的是,以下方法有效:

from p in People
where p.Name == "George Lucas"
select new { p.TitlesActedIn }
正如这一点:

(from p in People
where p.Name == "George Lucas"
select new { p.TitlesActedIn }).First().TitlesActedIn
WCF客户端在URI转换中自动添加扩展调用:

http://odata.netflix.com/Catalog/People()?$filter=Name eq 'George Lucas'&$top=1&$expand=TitlesActedIn&$select=TitlesActedIn/*

如果使用group by子句和lambda表达式使用WCF数据服务获取数据,则会出现类似错误。我知道WCF数据服务不支持某些操作。请确保您没有使用不受支持的LINQ操作


围绕您的查询发布整个语句。您将查询分配给什么?这是LINQ to SQL吗?
人来自哪里?看起来像DataService客户端api。我需要返回George Lucas导演的所有电影的列表。人和标题/电影是我第一次查询使用的两个实体,我得到NotSupportedException只能在上次导航后指定查询选项(orderby、where、take、skip)"是的,这是因为名称不是netflix目录中的键,所以您需要发出两个查询…根据我建议的解决方案,我可以使用子查询组合这两个查询吗?如果可以,我如何用查询替换键。我说的是您的第二个解决方案否。但另一个选项是尝试展开查询…然后您可以使用Justin的代码…Actually我刚刚在我的答案中添加了$expand解决方案…也许这是你最好的选择。在这种情况下,这确实是一个很好的答案。但我认为你应该小心使用expand这样的解决方案…重要的是要了解你得到的数据比你实际需要的要多得多。例如,在移动平台上,两个查询可能更好。你能请告诉我您为什么使用Expand?感谢您添加有关数据成本的说明。您获得了我的+1
http://odata.netflix.com/Catalog/People()?$filter=Name eq 'George Lucas'&$top=1&$expand=TitlesActedIn&$select=TitlesActedIn/*