Linq查询错误

时间:2011-04-21 16:26:38

标签: linq wcf-data-services linqpad

我正在使用以下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”。

请建议解决方案。

4 个答案:

答案 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操作。

http://msdn.microsoft.com/en-us/library/ee622463.aspx