2010-02-24 9 views
2

J'ai un objet avec deux propriétés entières différentes, et j'essaie d'obtenir un nouvel objet dans Linq to Entities, combinant deux propriétés entières du même objet que des chaînes concaténées , comme suitLINQ: concaténer des propriétés int multiples en une chaîne

List<DateRange> collection = (from d in context.dates 
select new DateRange 
{ 
    DateString = from s in context.Seasons 
    where s.SeasonID = d.DateID 
    select string.Format("{0} - {1}", s.StartYear, s.EndYear) } 

).ToList<DateRange>(); 

La concaténation de chaîne des années ne compilera pas.

+0

Utilisez-vous LINQ-to-SQL? – SLaks

+0

Votre code devrait fonctionner correctement. Avez-vous une erreur? – SLaks

+0

Est-il prudent de supposer que vous utilisez LINQ to SQL ou LINQ to Entities? J'ai noté context.dates et context.Seasons ... Je ne suis pas sûr du contexte, mais si c'est un contexte de base de données ... cela voudrait dire que vous n'avez pas la pleine puissance de LINQ à votre disposition, comme ces fournisseurs couvrent la plupart, mais pas tous, de l'interface IQueryable . – jrista

Répondre

2

En supposant que vous vous connectez à une base de données via LINQ to SQL/entités, puis l'appel String.Format échouera probablement, car avec ces fournisseurs, la clause select est exécutée dans la base de données. Tout ne peut pas être traduit de C# en SQL.

Pour convertir vos résultats de base de données dans une chaîne comme vous voulez, ce qui suit devrait fonctionner:

var temp = (
    from d in context.dates 
    from s in context.Seasons 
    where s.SeasonID == d.DateID 
    select new { s.StartYear, s.EndYear } 
).ToList(); // Execute query against database now, before converting date parts to a string 

var temp2 = 
    from t in temp 
    select new DateRange 
    { 
    DateString = t.StartYear + " - " + t.EndYear 
    }; 

List<DateRange> collection = temp2.ToList(); 

EDIT: Je eu une pensée supplémentaire. L'appel String.Format est probablement le problème. Je ne sais pas si cela fonctionnerait ou non, mais qu'en est-un concat plain-jane:

List<DateRange> collection = 
(from d in context.dates 
select new DateRange 
{ 
    DateString = from s in context.Seasons 
    where s.SeasonID = d.DateID 
    select s.StartYear + " - " + s.EndYear 
} 
).ToList<DateRange>(); 
+0

Je vais essayer cela et faire un rapport. –

+0

Oui, cela fonctionne. La ToList est essentielle, comme vous l'avez supposé, pour retourner le resultset en premier, puis le manipuler en dehors de la base de données avec le second objet. Je souhaite que mon esprit soit aussi organisé que le tien! –

+0

Ha! Eh bien, je ne suis pas sûr que c'est si organisé. ; P J'ai juste traversé l'enfer en travaillant avec EF v1.0 dans le passé, et j'ai rencontré à peu près tous les problèmes qu'il a. C'était un assez commun. Si vous avez l'option, je recommande vivement de passer à EV v4.0 (et .NET 4.0) dès que possible, car il s'agit d'un ORM plus puissant que EF v1 ou L2S.Il prend également en charge beaucoup plus de transformations ainsi que les mappages de fonctions db personnalisés, donc des choses comme String.Format (ou une implémentation similaire personnalisée) pourraient effectivement fonctionner. – jrista

3

Cela fonctionne dans LINQ aux objets, à condition que chaque objet dans des objets est une classe ou struct contenant des champs ou des propriétés « Nombre1 » et « NUMBER2 »:

var results = from o in objects 
       select string.Format("{0} - {1}", o.Number1, o.Number2); 

(Cependant, votre original devrait fonctionner, ainsi ...)

+0

Ce sont d'excellentes suggestions. J'utilise Linq pour les entités. Je suppose que ma situation est plus complexe que celle que j'ai décrite. Voici à peu près la configuration: Liste collection = (à partir de d dans context.dates sélectionnez new DateRange {DateRange = de s dans context.Seasons où s.SeasonID = d.DateID sélectionnez string.Format ("{0} - {1 } ", s.StartYear, s.EndYear)}). ToList (); La concaténation de chaîne ne sera pas compilée ici. –

2

Votre code original fonctionne si vous voulez vraiment ce que vous avez écrit. Cependant, si votre voulez vraiment obtenir de

var objects = new MyObject[]{ 
    new MyObject {Int1 = 1, Int2 = 2}, 
    new MyObject {Int1 = 3, Int2 = 4}}; 

quelque chose comme 1 - 2 - 3 - 4, vous pouvez écrire

var strings = objects.Select(o = > string.Format("{0} - {1}", o.Int1, o.Int2).ToArray(); 
var output = string.Join(" - ", strings); 
1
using System.Data.Objects.SqlClient; 
    : 
    : 
    List<DateRange> collection = (from d in context.dates 
    select new DateRange 
    { 
     DateString = from s in context.Seasons 
     where s.SeasonID = d.DateID 
     select SqlFunctions.StringConvert((double)s.StartYear) + " - " + 
      SqlFunctions.StringConvert((double)s.EndYear) 
    }).ToList<DateRange>(); 

La méthode StringConvert est converti en la fonction de conversion appropriée lorsque l'instruction LINQ est converti en SQL pour l'exécution sur le serveur.