当前位置: 首页 > 面试题库 >

如何从LINQ实现SQL CASE语句

王飞英
2023-03-14
问题内容

我是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();

谢谢。


问题答案:

如果适合您,可以使用它。我只解释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; }

    }


 类似资料:
  • 问题内容: 我有一个任务,要使用JavaCC为讲师提供的语言制作具有语义分析的自上而下的解析器。我已经写了生产规则,没有错误。我完全陷入了如何在代码中使用JJTree的问题,而我花大量时间在互联网上搜索教程的时间也没有吸引我。只是想知道有人可以花点时间来解释如何在代码中实现JJTree吗?或者,如果某个地方有隐藏的分步教程,那将对您有很大的帮助! 如果有帮助,以下是我的一些生产规则。提前致谢! 问

  • 本文向大家介绍Python如何实现文本转语音,包括了Python如何实现文本转语音的使用技巧和注意事项,需要的朋友参考一下 准备 我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了。 使用Speech API 原理 我们的想法是借助微软的语音接口,所以我们肯定是要进行调用 相关的接口。所以我们需要安装pywin32来帮助我们完成这一个底层的交互。 示

  • 问题内容: 我有一个包含以下内容的文本文件: 对于每一个“要素”我总是有,而且,我需要阅读。 如果可能的话,我想使用Java 8流。 是否可以模拟switch语句的行为? 问题答案: 解析此类文件的最佳方法(不使用专用的第三方库)是通过regex API及其前端类。不幸的是,目前缺少通过Stream API实现它的最佳操作。即,并且还不存在。因此,除非我们要等到Java 9,否则我们必须为Java

  • 问题内容: 我很好奇LINQ(不是LINQ to SQL)在后台执行的连接与Sql Server执行连接的方式究竟有何不同。 SqlServer在执行查询之前,会生成一个执行计划。执行计划基本上是一个表达式树,它认为这是执行查询的最佳方法。每个节点都提供有关是否执行排序,扫描,选择,合并等信息。 在执行计划的“加入”节点上,我们可以看到三种可能的算法:哈希联接,合并联接和嵌套循环联接。Sql Se

  • 我正在尝试设置詹金斯主从环境。在网上搜索后,有许多说明说明如何从头开始设置。但是我的情况有点不同,有一个jenkins实例目前在AWS EC2环境中运行。我想让这个实例成为slave,并设置另一个jenkins实例作为master来控制那个slave。我跟踪了这个链接:'https://wiki.jenkins-ci.org/display/jenkins/step+by+step+guide+t

  • 我正在尝试使用Perl6语法实现Markdown解析器,但被块引号卡住了。块引号段落不能用嵌套大括号表示,因为它是一个特定格式行的列表。但从语义上讲,它是一个嵌套的标记。 基本上可以归结为以下定义: mdBQLine令牌的实际实现与此无关。唯一需要注意的是,mdBQLineBody键包含实际引用的带有