【发布时间】:2011-07-15 13:54:39
【问题描述】:
这是代码,用 cmets 来解释发生了什么
public IQueryable<ImportUserAttemptViewModel> GetReports ()
{
// used to retrieve information
var userInfoServices = new UserInfoServices();
// get IQueryable<BasicImprtReport>
var attempts = GetBasicReports(type);
// convert to view model
var formattedAttempts =
(from BasicImportReport attempt in attempts
orderby attempt.DateStarted descending
select new ImportUserAttemptViewModel
{
ID = attempt.ID,
When = attempt.DateStarted,
NumberFailed = attempt.NumberFailed,
NumberProcessed = attempt.NumberProcessed,
UserName = userInfoServices.GetUserName(attempt.UserID)
});
return formattedAttempts;
}
当我尝试做GetReports.ToList()时,如:
var report = GetReports().ToList();
我得到错误:
LINQ to Entities 无法识别方法 'System.String GetUserName(Int32)' 方法,并且该方法无法翻译成 商店表达式。
我想这是因为userInfoServices 在延迟执行时超出了范围。有没有办法让 LINQ to 实体找到所需的方法?
(我知道还有其他解决方案,比如使用join来查找用户名,但是我有兴趣是否可以做其他事情)
【问题讨论】:
-
你为什么不把它作为一个列表返回,因为你无论如何都在执行
.ToList()? -
它将被传递给一个自定义列表类,该类将使用 Skip() 和 Take() 添加分页信息。我可以在这个函数中做到这一点,但它给了这个函数太多的责任。