我写了一个自定义方法,如下所示:
DateTime GetGregorianDate(string date)
{
return new DateTime(int.Parse(date.Substring(0, 4)), int.Parse(date.Substring(5, 2)), int.Parse(date.Substring(8, 2)), new System.Globalization.PersianCalendar());
}
我希望在linq查询中调用此方法,如下所示:
dynamic GetPlayerListByTeamName(string teamCode, FutsalEntities myEntity)
{
var player = (from p in myEntity.Players
where p.TeamCode == teamCode && (GetGregorianDate(p.ContractDateTo) <= DateTime.Now) ? true : false
select new { p.MeliCode, p.BearthDate, p.ContractNumber, p.InsuranceNumber, p.ContractDate, p.Mobile });
return player;
}
这是调用代码的地方:
private void cmbTeams_SelectedIndexChanged(object sender, EventArgs e)
{
using (FutsalEntities myEntity = new FutsalEntities())
{
if (cmbTeams.SelectedIndex != -1 && myEntity.Players.Count() != 0)
{
dgPlayerList.DataSource = GetPlayerListByTeamName(cmbTeams.SelectedValue.ToString(), myEntity);
但是当我运行应用程序时出现此错误:
LINQ to Entities无法识别方法'System.DateTime GetGregorianDate(System.String)'方法,并且此方法无法转换为商店表达式。
有没有办法在linq查询中调用此方法?
答案 0 :(得分:4)
Linq to Entities无法将您的方法转换为SQL并在服务器端执行它。调用自定义方法的唯一方法是将查询移动到内存中 - 例如致电AsEnumerable()
或ToList()
var players = from p in myEntity.Players.AsEnumerable()
where GetGregorianDate(p.ContractDateTo) <= DateTime.Now
select new {
p.Name,
p.BearthDate,
p.ContractNumber,
p.InsuranceNumber,
p.ContractDate,
p.Mobile
};
请注意,这会将所有播放器数据通过网络传输到本地计算机。
答案 1 :(得分:0)
将DateTime.Now转换为波斯日期,将其存储在变量中,然后在查询中使用该变量,以便服务器端查询进行波斯日期比较。