繁体   English   中英

Linq到实体/ EF:连接到小数点和字符串字段上的表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM