我是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}
答案 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() ...