【问题标题】:Cannot find the right method to call in a deferred LINQ statement在延迟的 LINQ 语句中找不到正确的调用方法
【发布时间】: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() 添加分页信息。我可以在这个函数中做到这一点,但它给了这个函数太多的责任。

标签: c# .net linq


【解决方案1】:

您可以在 LINQ 内的匿名类型定义中创建 userInfoService 的实例,这样您就没有可能超出范围的变量。但如果可能的话,向您的用户表添加一个联接。

【讨论】:

    【解决方案2】:

    你可以做类似的事情

    select new {
       attempt.ID,attempt.DateStarted,
       attempt.NumberFailed,attempt.NumberProcessed,
    }).AsEnumerable().Select(x => new ImportUserAttemptViewModel {
       ID = x.ID,
       When = x.DateStarted,
       NumberFailed = x.NumberFailed,
       NumberProcessed = x.NumberProcessed,
       UserName = userInfoServices.GetUserName(x.UserID)
    });
    

    在将 (AsEnumerable()) 切换到 GetUserName 的 LINQ-to-Objects 时使用匿名类型作为持有类型 - 但是请注意,这是一个潜在的 N+1;就个人而言,我会寻找一个需要多个 UserIdGetUserNames(...),然后我会将它们缝合在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 2011-05-02
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多