[英]Variable condition in LINQ where clause
我有一個我沒有創建的數據庫,我無法修改。 我需要運行linq查詢,但我需要在where
子句中傳入一個變量。
表中的列: AdvMonAM
(所有位), AdvMonAM
, AdvTueAM
, AdvTuePM
, AdvWedAM
等。
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 == true
或column == 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.