簡體   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