Linq to entity / EF: объединение таблиц в десятичном и строковом поле - PullRequest
1 голос
/ 03 ноября 2010

Я хочу объединить две таблицы, но два поля объединения отличаются для формата: один - десятичный, а другой - строка.

Linq не позволяет мне преобразовывать десятичное поле в строку с ToString() или строковое поле в десятичное с Convert.ToDecimal() командой.

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};

Есть ли способ сделать это?

1 Ответ

1 голос
/ 05 ноября 2010

Я бы тоже очень хотел исправить базу данных.Вы не говорите в своем вопросе, какое поле является строкой, а какое десятичным, но в любом случае я не думаю, что использование десятичного знака имеет смысл в качестве ключа.Было бы лучше, если бы они были строками, целыми числами или идентификаторами GUID.Тем не менее, у вас есть пара других опций.

Первый вариант - вы добавляете представление или сохраненный процесс, который преобразует одно из полей, прежде чем оно попадет в EF.перенести меньший набор данных в память и привести через код.Если я предполагаю, что GiftCards - это меньшее множество, а OwnerId - десятичное число, вы можете попробовать это:

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(),
        });

Выполнение этих запросов приведет к выполнению запросов, подобных следующим:*

SELECT ...
FROM [GiftCards] AS t0

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

Дайте мне знать, если это работает для вас.Приветствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...