1

我有一个包含 long 列表的对象。在数据库中,我将其存储为用逗号分隔的字符串。每当我进行读/写操作时,我总是会爆炸或加入这个字符串,我希望将这一步从业务逻辑移到查询中。所以这就是我对查询的尝试:

var TheData = (from l in MyDC.Table
               ....
               select new MyModel()
               {
                   TheListOfLongs = (from x in l.StringOfLongs.Split(',')
                                     select Convert.ToInt64(x)).ToList<long>(),

                    SomeObjectProp = ...

               }).ToList();

我得到的错误是:

方法 'System.String[] Split(Char[])' 不支持对 SQL 的转换。

如何修复我的查询以使其正常工作?

4

2 回答 2

3

您正在尝试在数据库上执行拆分操作,该操作会回复说“我不知道如何做您刚刚要求我做的事情!”。

.ToList()解决方案是在您编辑之前致电select new Model() :延期的返工和修改 - 不小心将拆分移动到错误的位置 - 应该现在

var TheData = (from l in MyDC.Table select new { 
    stringLong = l.StringOfLongs,
    OtherProps = //...
})
  .AsEnumerable()
  .Select(x => new Model 
                   { 
                       TheListOfLongs = x.stringLong 
                              .Split(',')   
                              .Select(y => Convert.ToInt64(y)
                              .Cast<long>(),
                       OtherProps = // ...
                   });

如果你希望这一切都在查询语法中,它看起来像这样:

var TheData = (from l in MyDC.Table select new { 
    stringLong = l.StringOfLongs,
    OtherProps = //...
}).AsEnumerable();

var RealTheData = (from l in TheData select new Model 
    {
        TheListOfLongs = (from s in l.stringLong 
                              .Split(',') select Convert.ToInt64(s).Cast<long>(),
                       OtherProps = // ...
    });
于 2013-02-11T21:10:37.017 回答
2
var TheData = MyDC.Table
                  .Where(...)
// optionally     .Select(l => new { l.StringOfLongs, l.SomeObjectProp })
                  .AsEnumerable() // move execution to memory
                  .Select(l => new Model() {
                      TheListOfLongs = l.StringOfLongs.Split(',')
                                        .Select(x => Int64.Parse(x))
                                        .ToList(),
                      SomeObjectProp = l.SomeObjectProp
                  }).ToList();
于 2013-02-11T21:14:23.297 回答