Chaîne de caractères.Split dans une Linq-to-SQL de la Requête?
J'ai une table de base de données qui contient une colonne nvarchar comme ceci:
1|12.6|18|19
J'ai un Objet Métier qui a un nombre Décimal [la propriété].
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 déclenche une NotSupportedException: Method 'System.String[] Split(Char[])' has no supported translation to SQL.
Qui suce plutôt 🙂 Est-il possible que je peux le faire sans avoir à ajouter une chaîne de propriété de l'objet de l'entreprise ou de sélectionner un type anonyme et puis en itérant à travers elle?
Ma "solution" 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 laid mais, avec que temporaire de la liste.
J'ai essayé d'ajouter un let mv = r.MeterValues.Split('|').Select(Decimal.Parse).ToArray()
mais que pour l'essentiel, conduit à la même NotSupportedException.
C'est .net 3.5SP1 si ce qui compte.
OriginalL'auteur Michael Stum | 2010-11-29
Vous devez vous connecter pour publier un commentaire.
Vous devez forcer la
select
clause pour s'exécuter sur le client en appelant.AsEnumerable()
première:Oui. Vous devez sélectionner l'ensemble du tableau, de toute façon. Si vous avez besoin seulement d'un sous-ensemble de champs, vous pouvez mettre un premier
Select
avant la.AsEnumerable
.Yep, ce n'est pas idéal, il va exécuter un "SELECT * from SomeTable". Ne L2SQL soutien de l'UDF? EF n'a (je pense). Si oui, vous pourriez faire la split côté serveur (e.g UDF)
Désolé, je pense que mon exemple n'était pas trop bien parce que j'ai omis la clause where pour que je puisse avoir.
Mettre le
where
clause avantAsEnumerable
.OriginalL'auteur SLaks
Vous n'avez pas besoin d'utiliser une liste temporaire:
OriginalL'auteur Thomas Levesque
Malheureusement son le IQueryable que vous utilisez (Linq to SQL) qui ne supporte pas la fonction de répartition.
Vous êtes vraiment à gauche avec l'interface IEnumerable (Linq to Objects) appui dans ce cas. Deuxième extrait de code est ce que vous devez faire, ou quelque chose comme...
OriginalL'auteur Tim Jarvis
Vous ne pouvez pas utiliser split, mais dans ce scénario, vous pouvez effectuer les opérations suivantes:
Ce code ajoute extérieur pipes (|) à la valeur de base de données à la volée à l'intérieur de la requête, de sorte que vous pouvez faire début, le milieu et la valeur à la fin des matchs sur la chaîne.
Par exemple, le code ci-dessus cherche "|19|" à l'intérieur "|1|12.6|18|19|", ce qui est trouvé et valide. Cela fonctionnera pour tout autre valueToFind.
OriginalL'auteur mhapps