我正在使用EDM中的代码第一种方法,并面临一个我无法解决的错误。请帮助我
LINQ to Entities无法识别方法'布尔值 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.
}
请帮我解决这个问题。
答案 0 :(得分: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));
答案 1 :(得分: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场景,并尝试以数据库可以理解的方式将逻辑表示为查询的一部分。
答案 2 :(得分:1)
使用Entity Framework,您不能将在数据库服务器上运行的代码与在应用程序内运行的代码混合在一起。您可以编写这样的查询的唯一方法是,如果您在SQL Server中定义了一个函数来实现您编写的代码。
有关如何将该函数公开给LINQ to Entities的更多信息,请参见here。
或者,您必须在初始查询之外调用CheckMeetingSettings
,如Eranga所示。
答案 3 :(得分: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
。