实体框架中的转换错误

时间:2013-09-18 10:45:06

标签: c# linq entity-framework

我是Entity Framework的新手。我正在尝试使用LINQ查询和实体框架从数据库中检索数据。

IEnumerable<Gate> lstGate = from tbsite in dc.tblSites
                            select new Gate
                            {
                              CalledInAt = DateTime.Parse(tbsite.CalledInAt.ToString(), new CultureInfo("en-GB", false)),
                              RemoteType = tbsite.RemoteType,
                              NoOfRemotes = (tbsite.NoOfRemotes == null) ? 0 : Convert.ToInt32(tbsite.NoOfRemotes),
                              GateType = tbsite.GateType,
                              NoOfRacks = (tbsite.NoOfRacks == null) ? 0 : Convert.ToInt32(tbsite.NoOfRacks),
                            };

我的模特:

public class Gate
    {

        public DateTime CalledInAt { get; set; }

        public string RemoteType { get; set; }
        public int NoOfRemotes { get; set; }
        public string GateType { get; set; }
        public int NoOfRacks { get; set; }
        public string ClickToEdit { get; set; }

    }

我遇到了以下错误。

  

“LINQ to Entities无法识别方法'System.DateTime   Parse(System.String,System.IFormatProvider)'方法和这个方法   无法转换为商店表达式。“} System.SystemException   {System.NotSupportedException}

     

{“LINQ to Entities无法识别方法'Int32   ToInt32(System.Object)'方法,并且此方法无法翻译   到商店表达式。“} System.SystemException   {System.NotSupportedException}

2 个答案:

答案 0 :(得分:2)

正如Nilesh在他的评论中指出的那样

  

你不能在LINQ中使用.Net函数,因为这将转换为实际的SQL。这就是它抱怨转换的原因。示例=您无法使用Convert.toInt32,因为SQL Server不知道此函数是什么。

解决问题的一个简单方法是致电ToList()。这将执行查询并使用结果填充列表。之后可以使用ToString()Convert.ToInt32,因为值都在内存中,您可以自由使用.NET方法。

IEnumerable<Gate> lstGate = from tbsite in dc.tblSites.ToList()
                            select new Gate
                            {
                              CalledInAt = DateTime.Parse(tbsite.CalledInAt.ToString(), new CultureInfo("en-GB", false)),
                              RemoteType = tbsite.RemoteType,
                              NoOfRemotes = (tbsite.NoOfRemotes == null) ? 0 : Convert.ToInt32(tbsite.NoOfRemotes),
                              GateType = tbsite.GateType,
                              NoOfRacks = (tbsite.NoOfRacks == null) ? 0 : Convert.ToInt32(tbsite.NoOfRacks),
                            };

调用dc.tblSites.ToList()将读取表中的所有值和行。如果您要应用排序或过滤以减少读取数据量,则需要在Where()

之前应用OrderBy()ToList()来电

答案 1 :(得分:0)

您收到该错误,因为EF正在将选择部件发送到服务器 两件事

1)可以直接使用dc.tblSites中的对象。

2)如果你真的想要转换它们,首先从数据库中获取数据,然后创建对象 .ToArray()是一个很好的。

... from tbsite in dc.tblSites.ToArray() ...