LINQ to Entities无法识别方法“Boolean CheckMeetingSettings(Int64,Int64)”方法

LINQ to Entities无法识别方法“Boolean CheckMeetingSettings(Int64,Int64)”方法,linq,entity-framework,c#-4.0,linq-to-entities,Linq,Entity Framework,C# 4.0,Linq To Entities,我在EDM中使用代码优先的方法,面临一个无法解决的错误。请帮助我 LINQ to实体无法识别方法“布尔” CheckMeetingSettingsInt64,Int64'方法,此方法不能为空 翻译成商店表达式 我的代码如下这是我写的查询 from per in obj.tempPersonConferenceDbSet where per.Conference.Id == 2 select new PersonDetials {

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

LINQ to实体无法识别方法“布尔” CheckMeetingSettingsInt64,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.
}

请帮我解决这个问题。

Linq to实体无法将自定义代码转换为SQL查询

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

我对fluid语法比较熟悉,所以我在下面的示例中使用了它

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) })

如果您的CeMeMeTeSET设置方法也访问数据库,您可能需要考虑不使用分离的方法来防止选择N+1方案,并尝试以数据库可以理解的方式将逻辑表示为查询的一部分。

< P> 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));

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

有关如何将该函数公开给LINQ to实体的更多信息,请参见

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

尝试:

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.
}

你必须使用一个数字,这样你就可以进行CheckMeeting设置。

谢谢你的回复,但我也需要分页。在我的数据库中,我有超过1个lac用户。请使用分页…@user1314655使用Skip和Take方法分页。您还需要使用order by对查询进行排序。请参阅我编辑的答案。感谢您的建议,我将遵循它,因为它正在工作,但执行查询需要花费大量时间。我们是否可以有其他方法快速完成查询。请帮助我获得您的答复。当我使用此代码时,我遇到了一些其他错误,例如。,{已经有一个与此命令关联的打开的DataReader,必须先关闭它。}