SQL

如何从LINQ实现SQL CASE语句

发布于 2021-06-04 16:43:40

我是LINQ的新手,我想知道是否可以从LINQ实现以下SQL查询?

我正在使用Entity Framework Core。

SELECT 0 [All], [Range] =
    CASE  
        WHEN Value BETWEEN 0 AND 25 THEN 'Low' 
        WHEN Value BETWEEN 25 AND 75 THEN 'Medium' 
        WHEN Value BETWEEN 75 AND 90 THEN 'High' 
        WHEN Value BETWEEN 90 AND 100 THEN 'Very High' 
    END 
FROM Result.Calculation C 
    INNER JOIN Data.SampleSet S ON C.SampleSetID = S.ID  
WHERE  S.SampleDrawn >= DATEADD(MONTH,-3,GETDATE()) AND S.Department = 'LOCATION A'

目前,我正在按以下方式使用FromSql来调用存储过程。我想知道是否可以在不使用存储过程的情况下做同样的事情?

var result = context.MyData.FromSql(“ data.GetMyData @pType = {0},@
pLocation = {1},@ pNoOfDays = {2},@ pStartDate = {3},@ pEndDate =
{4}”,类型,位置,noOfDays,startDate,endDate).ToList();

谢谢。

关注者
0
被浏览
68
1 个回答
  • 面试哥
    面试哥 2021-06-04
    为面试而生,有面试问题,就找面试哥。

    如果适合您,可以使用它。我只解释LINQ查询部分。您可以将其与EF一起使用。我为这些创建了虚拟数据。对于EF,请改用IQueryable。

    // from a row in first table
    // join a row in second table
    // on a.Criteria equal to b.Criteria
    // where additional conditions
    // select the records into these two fields called All and Range
    // Convert the result set to list.
    var query = (from a in lstCalc
    join b in lstSampleSet
    on a.SampleSetID equals b.ID where b.SampleDrawn >= DateTime.Now.AddMonths(-8)
    && b.Department == "Location A"
    select new { All = 0, Range = Utilities.RangeProvider(a.Value) }).ToList();
    

    编辑:LINQ查询分组结果。 。确保您正在使用IQueryable。

     var query = (from a in lstCalc
      join b in lstSampleSet
      on a.SampleSetID equals b.ID where b.SampleDrawn >= DateTime.Now.AddMonths(-8) 
       && b.Department == "Location A"
        group a by Utilities.RangeProvider(a.Value) into groupedData
         select new Result { All = groupedData.Sum(y => y.Value), Range = 
       groupedData.Key }).ToList();
    

    这是相同的代码。

     public class Program
        {
            public static void Main(string[] args) {
                List<Calculation> lstCalc = new List<Calculation>();
                lstCalc.Add(new Calculation() {SampleSetID=1, Value=10 });
                lstCalc.Add(new Calculation() { SampleSetID = 1, Value = 10 });
                lstCalc.Add(new Calculation() { SampleSetID = 2, Value = 20 });
                lstCalc.Add(new Calculation() { SampleSetID = 3, Value = 30 });
                lstCalc.Add(new Calculation() { SampleSetID = 4, Value = 40 });
                lstCalc.Add(new Calculation() { SampleSetID = 5, Value = 50 });
                lstCalc.Add(new Calculation() { SampleSetID = 6, Value = 60 });
                lstCalc.Add(new Calculation() { SampleSetID = 7, Value = 70 });
                lstCalc.Add(new Calculation() { SampleSetID = 8, Value = 80 });
                lstCalc.Add(new Calculation() { SampleSetID = 9, Value = 90 });
    
                List<SampleSet> lstSampleSet = new List<SampleSet>();
                lstSampleSet.Add(new SampleSet() {Department = "Location A", ID=1, SampleDrawn=DateTime.Now.AddMonths(-5)});
                lstSampleSet.Add(new SampleSet() { Department = "Location A", ID = 2, SampleDrawn = DateTime.Now.AddMonths(-4) });
                lstSampleSet.Add(new SampleSet() { Department = "Location A", ID = 3, SampleDrawn = DateTime.Now.AddMonths(-3) });
                lstSampleSet.Add(new SampleSet() { Department = "Location A", ID = 4, SampleDrawn = DateTime.Now.AddMonths(-2) });
                lstSampleSet.Add(new SampleSet() { Department = "Location A", ID = 5, SampleDrawn = DateTime.Now.AddMonths(-2) });
                lstSampleSet.Add(new SampleSet() { Department = "Location A", ID = 6, SampleDrawn = DateTime.Now.AddMonths(-2) });
                lstSampleSet.Add(new SampleSet() { Department = "Location A", ID = 7, SampleDrawn = DateTime.Now.AddMonths(-1) });
    
                var query = (from a in lstCalc
                            join b in lstSampleSet
                            on a.SampleSetID equals b.ID where b.SampleDrawn >= DateTime.Now.AddMonths(-8)
                             && b.Department == "Location A"
                            select new { All = 0, Range = Utilities.RangeProvider(a.Value) }).ToList();
    
                Console.WriteLine(query.Count);
                Console.ReadLine();
    
            }
    
    
        }
    
            public class Utilities
            {
                public static string RangeProvider(int value)
                {
                    if (value > 0 && value <= 25)
                    { return "Low"; }
                    if (value > 25 && value <= 75)
                    { return "Medium"; }
                    if (value > 75 && value <= 90)
                    { return "High"; }
                    else
                    { return "Very High"; }
                }
    
            }
    
        public class Result {
          public int All { get; set; }
          public string Range { get; set; }
       }
    
        public class Calculation
        {
            public int SampleSetID { get; set; }
            public int Value { get; set; }
    
        }
    
        public class SampleSet
        {
            public int ID { get; set; }
            public DateTime SampleDrawn { get; set; }
    
            public string Department { get; set; }
    
        }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看