代码之家  ›  专栏  ›  技术社区  ›  Michael Stum

字符串。在Linq To SQL查询中拆分?

  •  9
  • Michael Stum  · 技术社区  · 15 年前

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

    1|12.6|18|19
    

    我有一个具有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();
    

    这抛出了一个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[]
    

    不过,有了那个临时名单,这有点难看。

    我试着加一个 let mv = r.MeterValues.Split('|').Select(Decimal.Parse).ToArray() 但这本质上导致了同样的NotSupportedException。

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

    4 回复  |  直到 15 年前
        1
  •  6
  •   SLaks    15 年前

    你需要强迫 select 通过调用 .AsEnumerable() 第一:

    var result = db.SomeTable.AsEnumerable().Select(r => new BusinessObject {
        ...
        MeterValues = r.MeterValues.Split('|').Select(Decimal.Parse).ToArray()
    }).ToList();
    
        2
  •  3
  •   mhapps    9 年前

    您不能使用split,但在这种情况下,您可以执行以下操作:

    // Database value is 1|12.6|18|19
    
    string valueToFind = "19";
    
    var temp = from r in db.SomeTable.Where(r => ("|" + r.MeterValues + "|").Contains("|" + valueToFind + "|"));
    

    这段代码在查询中动态地将外部管道(|)添加到数据库值,这样您就可以在字符串上进行开始、中间和结束值匹配。

    例如,上面的代码在“| 1 | 12.6 | 18 | 19 |”内查找“| 19 |”,找到并有效。这对任何其他人都有效 查找值 .

        3
  •  2
  •   Thomas Levesque    15 年前

    不需要使用临时列表:

    var query = from r in db.SomeTable
                select new
                {
                    r.Id,
                    r.Name,
                    r.MeterValues,
                    ...
                };
    
    var temp = from x in query.AsEnumerable()
               select new BusinessObject
               {
                   Id = x.Id,
                   Name = x.Name,
                   MeterValues = x.mv.Split('|').Select(Decimal.Parse).ToArray(),
                   ...
               };
    
    return temp.ToArray();
    
        4
  •  1
  •   Tim Jarvis    15 年前

    不幸的是,您正在使用的IQueryable(Linq to SQL)不支持Split函数。

    在本例中,您实际上只剩下对它的IEnumerable(Linq to Objects)支持。你的第二个代码片段是你需要做的,或者类似于。。。

    var temp = (from r in db.SomeTable select new { 
        mv = r.MeterValues, 
        bo = new BusinessObject { // all the other fields } 
    }).AsEnumerable().Select(blah, blah) ;
    
    推荐文章