[英]Linq to entities / EF : join to tables on a decimal and a string field
我想联接两个表,但是两个联接字段的格式不同:一个是小数,一个是字符串。
Linq不允许我使用ToString()
将十进制字段转换为字符串,或者使用Convert.ToDecimal()
comand将字符串字段转换为十进制。
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};
有没有办法做到这一点?
我也非常倾向于修复数据库。 您没有在问题中说哪个字段是字符串,哪个字段是小数,但是无论哪种方式,我都不认为使用小数作为键是有意义的。 如果它们都是字符串,整数或GUID,那会更好。 不过,您还有其他一些选择。
第一个选项是添加一个视图或存储的proc,该视图或存储的proc在转换到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")
让我知道这是否适合您。 干杯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.