我使用以下代码:
from c in Country
where c.IsActive.Equals(true)
orderby c.CountryName
select new
{
countryIDCode = c.CountryID + "|" + c.TwoDigitCode,
countryName = c.CountryName
}
但是我在运行它时遇到了这个错误:
无法将类型'System.Int32'强制转换为'System.Object'。 LINQ to Entities仅支持转换实体数据模型基元类型。
CountryID为int
类型,TwoDigitCode为string
类型。
如何正确连接?
答案 0 :(得分:22)
使用System.Data.Objects.SqlClient.SqlFunctions.StringConvert
from c in Country
where c.IsActive.Equals(true)
orderby c.CountryName
select new
{
countryIDCode = SqlFunctions.StringConvert((double)c.CountryID)
+ "|" + c.TwoDigitCode,
countryName = c.CountryName
}
答案 1 :(得分:7)
如果此错误阻止您前进并且是一个小型数据集,您可以通过枚举查询(调用ToList)来保证从数据库中检索。从那时起,您的操作将针对内存中的对象,您可能不会遇到您收到的错误。
var countries = (from c in Country
where c.IsActive.Equals(true)
orderby c.CountryName
select c).ToList();
var countryCodes = (from c in countries
where c.IsActive.Equals(true)
orderby c.CountryName
select new
{
countryIDCode = c.CountryID + "|" + c.TwoDigitCode,
countryName = c.CountryName
});
答案 2 :(得分:5)
本主题包含一系列CLR方法,这些方法可以转换为命令树规范函数并在服务器上执行:
对于不在此列表中的CLR方法,您必须使用.AsEnumerable()将结果下拉到客户端并执行LINQ to Objects查询。
答案 3 :(得分:2)
这是旧版Entity Framework的限制。我认为用v4解决了。对于您的版本,解决方法是将结果转换为可枚举:
from a in
(from c in Country
where c.IsActive.Equals(true)
orderby c.CountryName).AsEnumerable()
select new
{
countryIDCode = a.CountryID + "|" + a.TwoDigitCode,
countryName = a.CountryName
}
答案 4 :(得分:2)
int to string casting 没有mapping to a Canonical Function。
所以只需在 2个不同的列中返回 Int 和 String ,然后在使用{{1}后在.NET中连接它们方法:
AsEnumerable
答案 5 :(得分:2)
我能够使用以下代码连接字符串:
l.StateName + " " + SqlFunctions.StringConvert( (double?)l.Zip ).Trim()
似乎只有SqlFunctions.StringConvert( (double?)l.Zip )
才足够好,但结果字符串左边有一堆填充,导致字符串比较不匹配。事实证明,Trim()
可以减少额外费用。我相信SqlFunctions.StringConvert( (double?)l.Zip ).Trim()
有效地转变为SQL:LTrim(RTrim(STR(Zip)))
。
答案 6 :(得分:-3)
使用c.CountryId.ToString()
获取CountryId的字符串表示形式并将其连接到TwoDigitCode字段:
from c in Country
where c.IsActive.Equals(true)
orderby c.CountryName
select new
{
countryIDCode = c.CountryID.ToString() + "|" + c.TwoDigitCode,
countryName = c.CountryName
}
我希望你的错误实际上是编译器错误(不能想到编译器会以任何方式允许这个查询。我不知道它是如何知道Linq to Entities部分的。)
答案 7 :(得分:-3)
如果您需要将它们作为字符串连接在一起,则可以使用String.Format方法:
countryIDCode = String.Format("{0}|{1}", c.CountryID, c.TwoDigitCode)