簡體   English   中英

如何將這個SQL查詢轉換成c#中的LINQ

[英]How to convert this SQL query into LINQ in c#

UPDATE  m
SET     m.Score = s.AScore + '-' + s.BScore
FROM    #Matches m
        INNER JOIN Scores s ON m.MatchId = s.MatchId 
        AND s.InfoTypeId = (
                             CASE 
                              WHEN m.SportId = 1 AND (m.StatusId >= 13 AND m.StatusId <= 17) THEN 10
                              WHEN m.SportId = 1 AND m.StatusId = 20 THEN 24
                              WHEN m.SportId = 1 AND m.StatusId = 21 THEN 23
                              WHEN m.SportId = 1 AND m.StatusId = 18 THEN 8
                              ELSE 5
                             END
                           )

我在 C# 中有兩個列表,一個是 Matches,第二個是 Scores,我想從這些列表中獲取結果,就像這個查詢將返回的結果一樣。 意味着我想更新“匹配”列表的“分數”屬性,就像它在 SQL 查詢中更新一樣。
請任何幫助。


Matches.ForEach(m => m.Score = (Scores.Where(ms => ms.MatchId == m.MatchId
                                                   && ms.ScoreInfoTypeId == ((m.SportId == 1 && m.StatusId >= 13 && m.StatusId <= 17) ? 10
                                                                              : (m.SportId == 1 && m.StatusId == 20) ? 24
                                                                              : (m.SportId == 1 && m.StatusId == 21) ? 23
                                                                              : (m.SportId == 1 && m.StatusId == 18) ? 8
                                                                              : 5)).Select(ms => ms.AScore + "-" + ms.BScore).FirstOrDefault()));

我試過了,但我覺得太貴了。 這需要太多時間。 請問有什么優化方法嗎。

在 LinqPad 中嘗試這個示例。 您可以使用查詢語法連接 2 個列表並遍歷結果以設置匹配分數。 我用字典來簡化那個 switch case。

void Main()
{
    var matches = new[]{
    new Match{MatchId=1,SportId=1,StatusId=13,Score=""},
    new Match{MatchId=2,SportId=1,StatusId=18,Score=""},
    new Match{MatchId=3,SportId=2,StatusId=24,Score=""},
    };
    var scores = new[]{
     new{MatchId=1,AScore="10",BScore="0",InfoTypeId=10},
     new{MatchId=2,AScore="20",BScore="0",InfoTypeId=8},
     new{MatchId=3,AScore="30",BScore="0",InfoTypeId=5},
    };
    
    var dict = new Dictionary<int,int>{[13]=10,[14]=10,[15]=10,[16]=10,[17]=10,[20]=24,[21]=23,[18]=8};
    var data = (from m in matches 
               join s in scores on m.MatchId equals s.MatchId 
               where s.InfoTypeId == ((m.SportId == 1 && dict.ContainsKey(m.StatusId))? dict[m.StatusId] : 5)
               select new {m,s}
               ).ToList();
    data.ForEach(o => 
    { 
        o.m.Score = o.s.AScore + "-" + o.s.BScore;
    });
    matches.Dump();
}

class Match{public int MatchId; public int SportId; public int StatusId; public string Score;}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM