簡體   English   中英

LINQ where子句中的可變條件

[英]Variable condition in LINQ where clause

我有一個我沒有創建的數據庫,我無法修改。 我需要運行linq查詢,但我需要在where子句中傳入一個變量。

表中的列: AdvMonAM (所有位), AdvMonAMAdvTueAMAdvTuePMAdvWedAM等。

var column = "Adv" + dayOfWeek + time;
var employeesOnCall = from r in db.AdvOnCalls
                      where (variable column needed here) == true
                      select r.ChartEmployee;

如果我硬編碼r.AdvTueAM它完美地工作,但r.column == truecolumn == true則不然。 我覺得這應該是容易的,但我很難過。

我想找到在一天中給定時間待命的員工。

糟糕的數據庫設計導致了一個糟糕的解決方案:

where ( (column == "AdvMonAM" && AdvMonAM == 1)
        || (column == "AdvMonPM" && AdvMonPM == 1)
      )

等等,對於每個字段,您添加一個條件。 (我不確定返回的數據類型。如果bool ,刪除== 1

如果數據庫中的列不能為null:

string column = "Adv" + dayOfWeek + time;
var employeesOnCall = from r in db.AdvOnCalls
                      where (bool)r[column]
                      select r.ChartEmployee;

要么:

string column = "Adv" + dayOfWeek + time;
var employeesOnCall = from r in db.AdvOnCalls
                      where r.Field<bool>(column)
                      select r.ChartEmployee;

如果column的值可以為null:

string column = "Adv" + dayOfWeek + time;
var employeesOnCall = from r in db.AdvOnCalls
                      where r.Field<bool?>(column)==true
                      select r.ChartEmployee;

您可以使用Dynamic LINQ來執行以下操作:

var column = "Adv" + dayOfWeek + time;
var employeesOnCall = db.AdvOnCalls
    .Where (column + " = 1")
    .Select(x => x.ChartEmployee);

...等等。

您可以構建表達式樹來表示您想要手動執行的條件,而不是像您嘗試的那樣使用lambda:

public static IQueryable<T> WhereEquals<T>(
    this IQueryable<T> query,
    string property,
    object valueToCompare)
{
    var param = Expression.Parameter(typeof(T));
    var body = Expression.Equal(
        Expression.Property(param, property),
        Expression.Constant(valueToCompare));
    var lambda = Expression.Lambda<Func<T, bool>>(body, param);
    return query.Where(lambda);
}

這允許你寫:

var employeesOnCall = db.AdvOnCalls.WhereEquals(column, true)
    .Select(adv => adv.ChartEmployee);
  • 一種選擇

     var column = "Adv" + dayOfWeek + time; var employeesOnCall = from r in db.AdvOnCalls where GetPropByName(r, column) select r.ChartEmployee; 

    使用此功能:

     bool GetPropByName(AdvOnCall item, string column) { return (bool)item.GetType().GetProperty(column).GetValue(item, null); } 
  • 更好的選擇:):

     var employeesOnCall = from r in db.AdvOnCalls where columnSwitch(r, dayOfWeek, time) select r.ChartEmployee; 

    使用此功能:

     bool columnSwitch(AdvOnCall item, string dayOfWeek, string time) { if (time == "AM") if (dayOfWeek == "Mon") return item.AdvMonAM; else if (dayOfWeek == "Tue") return item.AdvTueAM; ... else // (time == "PM") if (dayOfWeek == "Mon") return item.AdvMonPM; else if (dayOfWeek == "Tue") return item.AdvTuePM; ... } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM