Linq to entities / EF:连接到小数和字符串字段的表

时间:2010-11-03 19:43:11

标签: c# linq linq-to-entities

我想加入两个表,但两个连接字段的格式不同: 一个是小数,一个是字符串。

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 个答案:

答案 0 :(得分:1)

我非常倾向于修复数据库。你没有在你的问题中说哪个字段是字符串,哪个是小数,但无论如何我不认为使用小数作为键是有意义的。如果它们都是字符串,整数或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")

如果这对您有用,请告诉我。欢呼声。