2017-10-04 48 views
1

我是LINQ的新手,我想知道是否可以通過LINQ實現下面的SQL查詢?我如何實現LINQ的SQL CASE語句

我正在使用實體框架核心。

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如下調用存儲過程。我想知道我是否可以在不使用存儲過程的情況下做同樣的事情?

變種結果= context.MyData.FromSql(「data.GetMyData @pType = {0},@pLocation = {1},@pNoOfDays = {2},@pStartDate = {3},@pEndDate = {4}「,type,location,noOfDays,startDate,endDate).ToList();

謝謝。

+6

您能向我們展示您正在使用的現有EF查詢嗎? – mjwills

+2

你已經嘗試了什麼?嘗試發佈一些代碼 - 你會得到更好的答案。另外發布你的實體類將有助於 –

回答

0

如果它適合你,你可以使用它。 我只是解釋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; } 

    } 
+0

是的,linq部分將保持相同。你可以試試看。 – Amit

+0

@Amit:謝謝。這工作。你能不能請讓我知道我如何擴展LINQ語句到組按範圍列? –

+0

@ChiranthaWanasinghe添加了對分組結果的查詢。 – Amit

1

您可以使用它。

from C in Calculations 
join S in SampleSets on C.SampleSetID equals S.ID 
where S.SampleDrawn >= DateTime.Now.AddMonths(-3) 
     && S.Department == "LOCATION A" 
select new { 
    All = 1 
    , Range = 
     (C.Value >= 0 && C.Value < 25) ? "Low" : 
     (C.Value >= 25 && C.Value < 75) ? "Medium" : 
     (C.Value >= 75 && C.Value < 90) ? "High" : 
     (C.Value >= 90 && C.Value <= 100) ? "Very High" : null 
} 
0

下面是最終的LINQ聲明,爲我工作。正如Amit在他的回答中所解釋的RangeProvider方法將用於替換SQL CASE語句。

var test2 = (from a in context.Calculations 
         join b in context.SampleSets on a.SampleSetID equals b.ID 
         where b.SampleDrawn >= DateTime.Now.AddDays(-10) && b.Department == "Location A" 
         group a by RangeProvider(a.Value) into groupedData 
         select new { All = groupedData.Count(), Range = groupedData.Key });