我正在使用以下Linq查询:
from p in People
where p.Name == "George Lucas"
select p.TitlesActedIn
其中TitlesActedIn是一个列表。人和TitlesActedIn被关联
但我收到错误:
InvalidCastException:无法将类型为“System.Linq.Expressions.PropertyExpression”的对象强制转换为“System.Data.Services.Client.ResourceExpression”。
请建议解决方案。
答案 0 :(得分:5)
一种非常简单的方法:
var query = People
.Expand("TitlesActedIn")
.Where(p => p.Name == "George Lucas")
.First()
.TitlesActedIn.Select(t => t.ShortName);
query.Dump();
需要注意的是,如果您传递的名称不存在,则会崩溃。 (第一个操作员将抛出异常。您需要保证名称存在,或者分两步执行。
如果你想一步到位,那就归结为:(请注意回来的内容)
http://odata.netflix.com/catalog/People()?$filter=Name eq 'George Lucas'&$top=1&$expand=TitlesActedIn
您需要展开,否则会在.First()
之后退出评估,因为TitlesActedIn将为空。
它基本上转换为选择Person,包含(展开)TitlesActedIn关联,然后选择名称(客户端)
这样做的缺点是你要从Titles表中撤回所有(所有字段)。因此,对于与其返回的Person相关联的每个标题(Title,Year,Description,ShortName等)。
如果您在两个查询中执行此操作,则只能从TitlesActedIn关联中撤回“ShortName”。
答案 1 :(得分:3)
更新: 请参阅此question and answer以了解数据服务中选择多项的限制+基于$ expand的另一种解决方案(请注意这需要支持扩展的服务器
如果这是WCF数据服务,则TitlesActedIn是相关电影的集合。 然后,只有当Person.Name是主键时,才能在一个查询中执行此操作。
为了说明这一点:
var titles = from p in people
where p.Name == "George Lucas"
from m in p.TitlesActedIn
select m;
将执行您想要的操作,但仅当Name是Person实体的键时,否则不支持。
如果Name不是关键的一种方法(今天)有两个查询,如下所示:
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的服务器 - 并非所有服务器都支持...
请注意,我们目前正致力于添加any/all support to OData和WCF数据服务,一旦发布,您就可以编写:
var titles = from t in titles
where t.Actors.Any(a => a.Name == "George Lucas")
select t;
希望这有帮助
注意: 在获取George Lucas密钥的代码中我创建了一个匿名类型,因为今天WCF数据服务不支持直接实现原语。
答案 2 :(得分:1)
有趣的是,以下工作:
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/*
答案 3 :(得分:0)
如果我使用group by子句和lambda表达式来使用WCF数据服务获取数据,我会收到类似的错误。我知道WCF数据服务不支持某些操作。请确保您没有使用不受支持的LINQ操作。