在LINQ to Entities中连接int和string

时间:2010-04-21 10:57:56

标签: linq entity-framework linq-to-entities

我使用以下代码:

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类型。

如何正确连接?

8 个答案:

答案 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方法,这些方法可以转换为命令树规范函数并在服务器上执行:

MSDN

对于不在此列表中的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)