Linq将整数转换为字符串

47

我如何将int型转换为string型?以下操作均无效:

from s in ctx.Services
    where s.Code.ToString().StartsWith("1")
    select s

from s in ctx.Services
    where Convert.ToString(s.Code).StartsWith("1")
    select s

from s in ctx.Services
    where ((string)s.Code).ToString().StartsWith("1")
    select s

编辑

我遇到的错误是:

LINQ to Entities 不认识 'System.String ToString()' 方法,并且这个方法不能被转换为存储表达式


前两个应该可以运行...你能详细解释一下"以下的都不能运行"是什么意思吗? - lc.
你没有得到任何结果吗?你确认“Code”列包含以“1”开头的值了吗? - Keith
6
他正在使用Linq to Entities而不是Linq to SQL - 这意味着这里的许多建议都不适用。 - ShuggyCoUk
9个回答

54

使用 EF v4,您可以使用SqlFunctions.StringConvert。 因此,您的代码将结束如下:

from s in ctx.Services
where SqlFunctions.StringConvert((double)s.Code).StartsWith("1")
select s

编辑

正如Rick在评论中提到的那样,将int强制转换为double(可能也可以是decimal)的原因是该函数没有int类型的重载。


10
这对我起作用了!有趣的是,显然这个函数没有针对“int”的重载。这就是为什么Brian在调用上述函数之前将其封装为“double”的原因。在我看来,这应该被标记为这个问题的答案。 - Rick Arthur
这个对我也起作用了。我同意Rick Arthur的看法,这应该是答案。 - Alban
2
这个答案比我的更有用,如果楼主想要改变采纳的答案那也没问题,否则我会添加一个注释来表明从v4开始应该使用你的答案。 - ShuggyCoUk
6
+1,但我想补充一点,我发现在使用.StartsWith()之前需要使用.Trim(),因为EF会在数字左侧填充空格。 - Joel Brown
@JoelBrown - 谢谢!我在很多地方看到了这种方法,但是我一直搞不清楚为什么它不起作用。使用Trim()函数解决了问题。 - daveaglick

32

Linq to Entities 不支持将许多函数转换为服务器托管的 SQL。

其中之一是 ToString (对任何内容)。

以下是支持的函数列表

此前在 Stack Overflow 上已经有人提出了类似问题,具体可以参考如何将 int 转换为 string


8
你提供的第一个链接已失效。 - Mark Rogers

2

我遇到了类似的问题。

        IQueryable<Street> query = db.Streets.AsQueryable();
        query = query.Where(street => street.Name.ToLower().StartsWith(keyword))
                        .Take(10)
                        .OrderBy(street => street.Name);

        var list = query.Select(street => new
        {
            street.StreetId,
            Name = street.Name + " " + street.Suburb.Name + " " + street.Suburb.State.Name + " " + street.Suburb.Postcode

        });

当 street.Suburb.Postcode 抛出“无法转换非基元类型错误”时,它是一个 int 类型吗?在查看 shuggy 的链接后,我通过添加 .AsEnumerable 来强制 int? -> string 转换“客户端”即 LINQ to Objects。即。

var list = query.AsEnumerable().Select(street => new
        {
            street.StreetId,
            Name = street.Name + " " + street.Suburb.Name + " " + street.Suburb.State.Name + " " + street.Suburb.Postcode

        });

谢谢,你绝对救了我的一天。添加 AsEnumerable 在这里是关键。 - Mohammed Swillam
AsEnumerable()会导致整个数据库表被加载到内存中吗? - EricP

2
使用LINQ to Objects时,您可以使用ToString()助手。

1

我尝试了这个解决方法,对我有效:

from s in ctx.Services
where (s.Code + "").StartsWith("1")
select s

希望这能有所帮助


1
将IQueryable转换为IEnumerable,因为IQueryable继承了IEnumerable。请参见http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx - 特别是:'枚举会导致与IQueryable对象关联的表达式树被执行。' 我认为重要的是“执行表达式树的定义是特定于查询提供程序的”。
在这种情况下,IQueryable非常强大,但被误用了。

这个方法是在这个类似的问题中提出的。这种方法的好处是它适用于非数字数据,比如Guids。 - Matt Penner

-1

这是一种实现的方法。

int[] x = new int[] {11,3,15,7,19};

var j = from s in x where s.ToString().StartsWith( "1") select s.ToString();

Console.WriteLine( j );

7
这对他没有帮助 - 他正在使用LINQ to Entities。 - ShuggyCoUk

-1
var items = from c in contacts
select new ListItem
{
    Value = String.Concat(c.ContactId), //This Works in Linq to Entities!
    Text = c.Name
};

我发现SqlFunctions.StringConvert((double)c.Age)对于我来说也不起作用,即使该字段是可空类型。

在过去的几天里,我进行了大量搜索和试错,才找到了这个问题的解决方法。

希望这能帮助一些程序员。


1
我正在尝试选择SelectListItems并将int ID转换为字符串"Value"属性,就像您的示例一样。但是使用这段代码,我得到了LINQ to Entities does not recognize the method 'System.String Concat(System.Object)' method, and this method cannot be translated into a store expression.的错误提示。 - Neil Laslett

-1
from s in ctx.Services.ToList()
    where s.Code.ToString().StartsWith("1")
    select s   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接