-2

我正在使用 EDM 中的代码优先方法并面临一个我无法解决的错误。请帮助我

LINQ to Entities 无法识别方法 'Boolean CheckMeetingSettings(Int64, Int64)' 方法,并且此方法无法转换为存储表达式。

我的代码如下(这是我写的查询

from per in obj.tempPersonConferenceDbSet
           where per.Conference.Id == 2
           select new PersonDetials
           {
               Id = per.Person.Id,
               JobTitle = per.Person.JobTitle,
               CanSendMeetingRequest = CheckMeetingSettings(6327,per.Person.Id)
           }

public bool CheckMeetingSettings(int,int)
{
  ///code I have written.
}

请帮我解决这个问题。

4

4 回答 4

3

EF 无法将自定义代码转换为 SQL。尝试迭代结果集并在 LINQ 查询之外分配属性。

var people = (from per in obj.tempPersonConferenceDbSet
           where per.Conference.Id == 2
           order by /**/
           select new PersonDetials
           {
               Id = per.Person.Id,
               JobTitle = per.Person.JobTitle,
           }).Skip(/*records count to skip*/)
             .Take(/*records count to retrieve*/)
             .ToList();

people.ForEach(p => p.CanSendMeetingRequest = CheckMeetingSettings(6327, p.Id));
于 2012-04-05T08:07:05.627 回答
1

Linq to Entities 无法将您的自定义代码转换为 SQL 查询。

您可能会考虑首先仅选择数据库列,然后添加 .ToList() 以强制解析查询。获得这些结果后,您可以再次选择从 CheckMeetingSettings 方法中添加信息的位置。

我更喜欢流畅的语法,所以我在下面的例子中使用了它。

var query = obj.tempPersonConferenceDbSet
               .Where(per => per.Conference.Id == 2).Select(per => new { Id = per.Person.Id, JobTitle = per.Person.JobTitle })
               .ToList()
               .Select(per => new PersonDetails { Id = per.Id, 
                                                  JobTitle = per.JobTitle,
                                                  CanSendMeetingRequest = CheckMeetingSettings(6327, per.Person.Id) })

如果您的 CheckMeetingSettings 方法还访问数据库,您可能要考虑不使用单独的方法来防止 SELECT N+1 场景,并尝试以数据库可以理解的方式将逻辑表达为查询的一部分。

于 2012-04-05T08:04:08.037 回答
1

尝试:

var personDetails = obj.tempPersonConferenceDbSet.Where(p=>p.ConferenceId == 2).AsEnumerable().Select(p=> new PersonDetials
           {
               Id = per.Person.Id,
               JobTitle = per.Person.JobTitle,
               CanSendMeetingRequest = CheckMeetingSettings(6327,per.Person.Id)
           });

public bool CheckMeetingSettings(int,int)
{
  ///code I have written.
}

你必须使用AsEnumerable()这样你才能预成型CheckMeetingSettings

于 2012-04-05T08:10:17.443 回答
1

使用 Entity Framework,您不能将在数据库服务器上运行的代码与在应用程序内部运行的代码混合在一起。编写这样的查询的唯一方法是在 SQL Server 中定义一个函数来实现您编写的代码。

可以在此处找到有关如何将该函数公开给 LINQ to Entities 的更多信息。

或者,您必须CheckMeetingSettings在初始查询之外调用,如 Eranga 所示。

于 2012-04-05T08:08:01.623 回答