J'ai une table de base de données qui contient une colonne nvarchar comme ceci:String.Split dans une requête Linq-To-SQL?
1|12.6|18|19
J'ai un objet d'affaires qui possède une propriété décimale [].
Ma requête LINQ ressemble à ceci:
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();
Cela jette un NotSupportedException: Method 'System.String[] Split(Char[])' has no supported translation to SQL.
qui suce un peu :) Est-il possible que je peux le faire sans avoir à ajouter une propriété de chaîne à la objet métier ou en sélectionnant un type anonyme, puis itérer à travers elle?
Ma "solution" actuelle est:
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[]
C'est un peu moche mais, avec cette liste temporaire.
J'ai essayé d'ajouter un let mv = r.MeterValues.Split('|').Select(Decimal.Parse).ToArray()
mais cela conduit essentiellement à la même NotSupportedException.
Ceci est .net 3.5SP1 si cela est important.
Est-ce que cela sélectionne la totalité de la table SomeTable? –
@Michael: Oui. Vous devez sélectionner la table entière de toute façon. Si vous avez seulement besoin d'un sous-ensemble des champs, vous pouvez mettre un 'Select' initial avant le' .AsEnumerable'. – SLaks
Oui, ce n'est pas l'idéal - il va essentiellement exécuter un "SELECT * FROM SomeTable". Est-ce que L2SQL supporte les UDF? EF le fait (je pense). Si oui, vous pourriez faire ce split côté serveur (par exemple UDF) – RPM1984