var items = from c in contacts
select new ListItem
{
Value = c.ContactId, //Cannot implicitly convert type 'int' (ContactId) to 'string' (Value).
Text = c.Name
};
var items = from c in contacts
select new ListItem
{
Value = c.ContactId.ToString(), //Throws exception: ToString is not supported in linq to entities.
Text = c.Name
};
有什么办法可以做到吗?
注意,在VB中。NET没有问题,使用第一个代码片段,它的工作只是伟大的,VB是灵活的,我无法习惯c#的严格!!
SqlFunctions。StringConvert可以工作,但我发现它很麻烦,而且大多数时候,我并不真正需要在SQL端执行字符串转换。
如果我想做字符串操作,我所做的是首先在linq-to-entities中执行查询,然后在linq-to-objects中操作sting。在本例中,我想获得一组数据,其中包含联系人的全名和ContactLocationKey,这是两个Integer列(ContactID和LocationID)的字符串连接。
// perform the linq-to-entities query, query execution is triggered by ToArray()
var data =
(from c in Context.Contacts
select new {
c.ContactID,
c.FullName,
c.LocationID
}).ToArray();
// at this point, the database has been called and we are working in
// linq-to-objects where ToString() is supported
// Key2 is an extra example that wouldn't work in linq-to-entities
var data2 =
(from c in data
select new {
c.FullName,
ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(),
Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString())
}).ToArray();
现在,我承认必须编写两个匿名选择确实很麻烦,但我认为,可以执行L2E中不支持的字符串(和其他)函数的便利性超过了这一点。还要记住,使用这种方法可能会降低性能。
SqlFunctions。StringConvert可以工作,但我发现它很麻烦,而且大多数时候,我并不真正需要在SQL端执行字符串转换。
如果我想做字符串操作,我所做的是首先在linq-to-entities中执行查询,然后在linq-to-objects中操作sting。在本例中,我想获得一组数据,其中包含联系人的全名和ContactLocationKey,这是两个Integer列(ContactID和LocationID)的字符串连接。
// perform the linq-to-entities query, query execution is triggered by ToArray()
var data =
(from c in Context.Contacts
select new {
c.ContactID,
c.FullName,
c.LocationID
}).ToArray();
// at this point, the database has been called and we are working in
// linq-to-objects where ToString() is supported
// Key2 is an extra example that wouldn't work in linq-to-entities
var data2 =
(from c in data
select new {
c.FullName,
ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(),
Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString())
}).ToArray();
现在,我承认必须编写两个匿名选择确实很麻烦,但我认为,可以执行L2E中不支持的字符串(和其他)函数的便利性超过了这一点。还要记住,使用这种方法可能会降低性能。
Brian Cauthon的回答非常棒!只是一个小更新,对于EF 6,类被移动到另一个名称空间。所以,在EF 6之前,你应该包括:
System.Data.Objects.SqlClient
如果您更新到EF 6,或者只是使用这个版本,请包括:
System.Data.Entity.SqlServer
通过使用EF6包含不正确的名称空间,代码将正常编译,但将抛出运行时错误。我希望这篇笔记有助于避免一些混乱。