2016-12-01 39 views
1

我想從統計數據表中單記錄與以下邏輯:與實體框架多重條件,從而獲得所需的記錄

1st preference : Flag = 0 
2nd preference : Flag = 1 
3rd preference : Flag = 2 (only if we dont have records with flag=0 and 1) 

表:統計

Id Zoneid Emergency Flag Date 
1 100  0   1  2016-6-01 13:10:05.360 
2 100  2   2  2016-6-01 14:10:05.360 
3 100  0   2  2016-6-01 15:10:05.360 
4 100  2   2  2016-6-01 16:10:05.360 
5 100  2   0  2016-6-01 14:10:05.360 
6 100  1   2  2016-6-01 13:10:05.360 

邏輯我想實施如下:

If(Flag == 0) then 
    take records with highest emergency(order by emergency desc) but if multiple records found then take latest record order by date desc(only 1). 
else if(flag==1) 
    Take records with highest emergency(order by emergency desc) but if multiple records found then take latest record order by date desc(only 1). 
else if (no records with flag==0 and flag==1 found) 
    Take records with highest emergency(order by emergency desc) but if multiple records found then take latest record order by date desc(only 1). 

數據模式L:

public partial class Zone 
{ 
    public int Id { get; set; } 
    public string Area { get; set; } 
    public virtual ICollection<Statistics> Statistics { get; set; } 
} 

public partial class Statistics 
{ 
    public int Id { get; set; } 
    public int ZoneId { get; set; } 
    public int Emergency { get; set; } 
    public int Flag { get; set; } 
    public System.DateTime Date { get; set; } 
    public virtual Zone Zone { get; set; } 
} 

我的查詢:

var statistics= (from z in db.Zone 
       select new 
       { 
        ZoneName = z.Area, 
        //Not getting how t implement multiple conditions in EF 
        StatisticsId = z.Statistics.Where(t => t.ZoneId == 100 &&) 
              .Select(t => t.Id).FirstOrDefault() 
       } 

所以在這裏,我沒有得到如何實現所有這些條件並獲得所需的統計記錄。

+0

如何選擇'SELECT TOP 1 ... ORDER BY Flag' resp。 LINQ OrderBy(...)的'。FirstOrDefault'? – LocEngineer

+0

@LocEngineer你能提供關於實體框架的答案嗎? –

回答

2

你所描述的一樣簡單的優先級順序聲音邏輯 - 先通過Flag上升,然後(對於相等Flag)由Emergency降,然後(對於相等FlagEmergency)由Date降下來,取第一記錄的順序:

StatisticsId = (from s in z.Statistics 
       where s.ZoneId == 100 
       orderby s.Flag, s.Emergency descending, s.Date descending 
       select (int?)s.Id).FirstOrDefault() ?? 0 
+0

是的,緊急事情沒有了我。感謝您完成訂單條款。 – LocEngineer

+0

好的你的答案我不需要任何測試,因爲我知道它會在所有情況下工作。你總是像往常一樣搖滾。謝謝:) –

1

有這個一杆(警告:未經檢驗的,沒有時間來重新創建類和所有):

var statistics= (from z in db.Zone 
       select new 
       { 
        ZoneName = z.Area, 
        StatisticsId = z.Statistics.OrderBy(t=>t.Flag) 
        .Where(t => t.ZoneId == 100).Select(t => t.Id).FirstOrDefault() 
       });