我想加入两个表,但两个连接字段的格式不同: 一个是小数,一个是字符串。
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};
有没有办法实现这个目标?
答案 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")
如果这对您有用,请告诉我。欢呼声。