1

我是实体框架的新手。我正在尝试使用 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}

4

2 回答 2

1

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

您不能在 LINQ 中使用 .Net 函数,因为这将被转换为实际的 SQL。这就是它抱怨转换的原因。Example = 你不能使用 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()orOrderBy()调用之前ToList()

于 2013-09-18T10:51:50.300 回答
0

您收到该错误是因为 EF 将 Select 部分发送到服务器有两件事

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

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

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

于 2013-09-18T10:56:37.600 回答