2010-11-03 5 views
1

Je veux joindre deux tables, mais les deux champs de jointure diffèrent pour le format: l'un est un nombre décimal et l'autre est une chaîne.Linq aux entités/EF: joindre aux tables sur un champ décimal et une chaîne

lorsque je fais le ToString() pour le décimal ou le Convert.ToDecimal() pour la chaîne, Linq ne l'accepte pas.

Y at-il un moyen d'accomplir ce que je veux?

var tmp = from c in gge.GiftCards 
    join p in gge.Customers 
on c.OwnerId equals p.customer_Key 
    into g 
    from o in g.DefaultIfEmpty() 
    select new MyCardViewModel {GiftCard = c, Customers= g}; 
+0

Peut-être possible dans ESQL, mais ... Je réparerais la base de données à la place. –

+0

hahaha, merci :) c'est un peu bizarre parce que le champ de chaîne peut pointer vers un certain nombre d'autres champs, dans ce cas c'est un champ décimal. – Michel

Répondre

1

Je serais très enclin à réparer la base de données aussi. Vous ne dites pas dans votre question quel champ est la chaîne et quelle est la décimale, mais de toute façon, je ne pense pas que l'utilisation d'une décimale ait un sens en tant que clé. Ce serait mieux si elles étaient à la fois des chaînes, des entiers ou des GUID. Néanmoins, vous avez quelques autres options.

La première option est d'ajouter une vue ou un proc stocké qui convertit l'un des champs avant qu'il n'atteigne l'EF.

L'autre option consiste à mettre en mémoire le jeu de données le plus petit et à le diffuser via le code. Si je suppose que GiftCards est le plus petit ensemble et que OwnerId est la décimale, vous pourriez essayer ceci:

var gcs = gge.GiftCards 
    .Select(gc => gc.OwnerId) 
    .ToDictionary(x => x.OwnerId.ToString(), x => x); 

var gcIds = gcs.Keys.ToArray(); 

var results = (
    from p in gge.Customers 
    where gcIds.Contains(p.customer_Key) 
    select p) 
    .ToArray() 
    .GroupBy(p => p.customer_Key) 
    .Select(p => new MyCardViewModel 
     { 
      GiftCard = gcs[p.Key], 
      Customers = p.ToArray(), 
     }); 

Faire ces requêtes provoquera des requêtes telles que les suivantes à exécuter:

SELECT ... 
FROM [GiftCards] AS t0 

SELECT ... 
FROM [Customers] AS t0 
WHERE t0.[customer_Key] IN ("1", "2", "3", ..., "1442") 

Let Je sais si cela fonctionne pour vous. À votre santé.

+0

Très bien, cela m'a vraiment aidé! – Michel