Linq-to-SQL查询中的String.Split?

Mic*_*tum 9 .net c# linq linq-to-sql

我有一个包含nvarchar列的数据库表,如下所示:

1|12.6|18|19
Run Code Online (Sandbox Code Playgroud)

我有一个具有Decimal []属性的业务对象.

我的LINQ查询如下所示:

var temp = from r in db.SomeTable select new BusinessObject {
    // Other BusinessObject Properties snipped as they are straight 1:1
    MeterValues = r.MeterValues.Split('|').Select(Decimal.Parse).ToArray()
};
var result = temp.ToArray();
Run Code Online (Sandbox Code Playgroud)

这会抛出NotSupportedException: Method 'System.String[] Split(Char[])' has no supported translation to SQL.

有点糟糕:)有没有办法我可以做到这一点,而无需向业务对象添加字符串属性或选择匿名类型然后迭代它?

我目前的"解决方案"是:

var temp = from r in db.SomeTable select new {
    mv = r.MeterValues,
    bo = new BusinessObject { // all the other fields }
};
var result = new List<BusinessObject>();
foreach(var t in temp) {
    var bo = t.bo;
    bo.MeterValues = t.mv.Split('|').Select(Decimal.Parse).ToArray();
    result.Add(bo);
}
return result.ToArray(); // The Method returns BusinessObject[]
Run Code Online (Sandbox Code Playgroud)

不过,这个临时名单有点难看.

我尝试添加一个let mv = r.MeterValues.Split('|').Select(Decimal.Parse).ToArray()但实际上导致相同的NotSupportedException.

如果重要的话,这是.net 3.5SP1.

SLa*_*aks 6

您需要先select通过调用强制该子句在客户端上运行.AsEnumerable():

var result = db.SomeTable.AsEnumerable().Select(r => new BusinessObject {
    ...
    MeterValues = r.MeterValues.Split('|').Select(Decimal.Parse).ToArray()
}).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 是的,这并不理想 - 它基本上会执行"SELECT*FROM SomeTable".L2SQL是否支持UDF?EF确实(我认为).如果是这样,你可以做拆分服务器端(例如UDF) (2认同)