2012-04-29 39 views
0

我由一个外键关系连接的两个对象,我使用的DataModel的对象与地图相关的对象:抓取使用LINQ和EF

事件:1 ------ *:资产

我写了获取所有资产,对于一个给定[eventPublicId]

List<Asset> assetList = 
    ReliableExecution.RetryWithExpression<Event, List<Asset>> 
    (u => u.FirstOrDefault(x => x.PublicId == eventPublicId).Assets.ToList()).ToList(); 

我的问题是,我不得不打电话ToList()两次,这看起来很笨拙的查询。此外,我不得不使用FirstOrDefault,但是当我试图使用[Where]或其他任何东西时,它不会编译。

有没有其他更好的方式如何可以重写这段代码?

这是RetryWithExpression签名参考:

public static TValue RetryWithExpression<T, TValue>(Func<ObjectSet<T>, TValue> func, Int32 retryInfiniteLoopGuard = 0) 
     where T : class 
+0

为什么你必须调用'ToList()'两次?你得到什么编译器错误? – Slauma

+0

如果我省略了第一个Assets.ToList,我得到一个编译错误:无法将lambda表达式转换为委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型。 如果我省略了第二个ToList,在运行时我得到了连接未打开的错误,但这是设计。 –

回答

1

您指定func参数应该返回一个List<Asset>,所以导航属性event.Assets不符合该法案:这是一个EntityCollection<Asset>,这是不会隐可兑换成代表退货类型显式转换ToList()创建指定的类型。

技术上,摆脱ToList的,你应该使用

ReliableExecution.RetryWithExpression<Event, EntityCollection<Asset>> ... 

,但我不知道是否能够满足您的功能性需求。

+0

这是有道理的,但在尝试EntityCollection后,我得到一个错误:“ObjectContext实例已被处置,不能再用于需要连接的操作”。这可能是由于设计原因,因为RetryWithExpression会在返回时处理连接。 RetryWithExpression不支持不同的执行,因为我必须做一个解决方法来集成瞬态故障处理应用程序块,但不幸的是,它不完全支持EF,我必须明确地管理连接。看起来我必须使用ToList来完成它。谢谢! –