2015-04-01 53 views
1

我有以下查詢: -LINQ的 - 動態條件

我想補充一個條件是動態的,因此,如果用戶通過DATEOFBIRTH應該e.DateOfBirth <= date

var data = ctx.Employee.Where(e => e.Id == Id 
           && e.Category == Category 
           && e.DateOfJoining <= date) 
           .Select(e => e) 
           .ToList(); 

如何動態調節?

+0

問題不清楚。什麼是「DATEOFBIRTH」,「DateTime」或意味着「按出生日期篩選」的字符串?你卡在哪裏,真正的問題是什麼? – 2015-04-01 11:19:49

+0

如果選擇了DateOfBirth,那麼'where'條件應該附加一個條件'e.DateOfBirth <= date' ..如果用戶選擇DateOfAnniversary,那麼它應該是'e.DateOfAnniversary <= date' .. – Anup 2015-04-01 11:22:16

+0

什麼意思在這種情況下「選擇」?您的要求的理想方法簽名是什麼? – 2015-04-01 11:23:20

回答

0

聽起來像你想做到以下幾點:

var employees = ctx.Employee.Where(e => e.Id == Id 
             && e.Category == Category 
             && e.DateOfJoining <= date); 

if (!string.IsNullOrWhiteSpace(DATEOFBIRTH)) 
{ 
    employees = employees.Where(e => e.DateOfBirth <= DATEOFBIRTH); 
} 

var data = employees.ToList(); 

你也可以做到以下幾點,這是更簡潔,但因爲它看起來像你在這裏查詢數據庫,我寧願上面的方法,因爲它不包含任何不必要的查詢。

var data = ctx.Employee.Where(e => e.Id == Id && 
            e.Category == Category && 
            e.DateOfJoining <= date && 
            (string.IsNullOrWhiteSpace(DATEOFBIRTH) || 
            e.DateOfBirth <= DATEOFBIRTH)) 
         .ToList(); 
+0

有沒有這方面的任何捷徑,因爲有一個很長的屬性列表。 – Anup 2015-04-01 11:26:21

0

從您的評論:

如果DateOfBirth被choosen,那裏有狀態應該由一個條件e.DateOfBirth <= date附加 ..如果用戶選擇 DateOfAnniversary那麼它應該是e.DateOfAnniversary <= date

然後您可以使用:

現在210
var data = ctx.Employee 
    .Where(e => e.Id == Id && e.Category == Category && e.DateOfJoining <= date); 

,假設filterbyDateOfBirthfilterbyDateOfAnniversarybools

if(filterbyDateOfBirth) 
    data = data.Where(e => e.DateOfBirth <= date); 
if(filterbyDateOfAnniversary) 
    data = data.Where(e => e.DateOfAnniversary <= date); 

var list = data.ToList(); 

由於LINQ的延遲執行數據庫在查詢ToList只有一次。

1

您可以使用反射來解決這個問題,但還有另外一個想法,可能會幫助您:

var criteria = new Dictionary<string, Func<Employee, bool>>(); 

    var date = DateTime.Now; //or any other value 

    //Initialize your criterias 
    criteria.Add("DATEOFBIRTH", e => e.DateOfBirth <= date); 
    criteria.Add("DateOfJoining", e => e.DateOfJoining <= date); 

    var selectedValue = "DATEOFBIRTH"; 

    var data = ctx.Employee.Where(e => e.Id == id && 
            e.Category == Category && 
            criteria[selectedValue](e)).ToList(); 

所以,如果你改變了selectedValue輸出將根據相應的您正在尋找的標準。

+1

+1提到反射,這將是一個更可維護的版本。但是這個解決方案也很棒,因爲條件(標準)可以放在別的地方,如果需要的話可以重新使用。 – Franck 2015-04-01 11:46:03

+1

我會反思字典。 Serms也是可以維護的,你可以訪問你想要的過濾器。通過反思,可以評估任何員工的財產。 – 2015-04-01 12:17:39