[英]Use If in C# linq Lambda expression
我希望我的方法檢查名為“onlyPresence”的復選框是否被選中,然后在 where 中添加一個新的 where 子句或新表達式,或者在 where 中使用 if ..
public IEnumerable<EmployeeInfo> GetAllVisibleEmployeesInfo(string sortBy, string name ,int startRowIndex, int maximumRows, string Department, bool onlyPresence )
{
name = Common.Converter.ConvertToFarsiYK(name ?? "").Trim();
var GetNowString = Common.Date.GregorianToPersian(DateTime.Now.Date, Common.Date.DateStringType.Short);
if (Department == null){Department = "";}
using (LinqDataContext context = DataContext)
{
List<EmployeeInfo> result = context.vwDailyWorks
.Where(q => (q.Visible == true))
.Where(q => (q.DepartmentName.Contains(Department)))
.Where(q => (string.IsNullOrEmpty(name) ||
(q.FirstName.Contains(name) ||
q.LastName.Contains(name) ||
q.Position.Contains(name) ||
q.Floor.Contains(name) ||
(q.Ext_Tel ?? -1).ToString().Contains(name) ||
q.Email.Contains(name) ||
q.DepartmentName.Contains(name)))
)
**.Where(w => { if (onlyPresence) { w.Even_Odd == 1} } )**
.GroupBy(t => t.EmployeeID)
.Select(t => new EmployeeInfo
{
FirstName = t.Max(s => s.FirstName),
LastName = t.Max(s => s.LastName),
Position = t.Max(s => s.Position),
DepartmentName = t.Max(s => s.DepartmentName),
Status2= GetPresent_Status(t.Key),
Extension = t.Max(s => s.Ext_Tel),
Info = GetPresenceInfo(t.Key, false),
ID = t.Key,
Email = t.Max(s => s.Email),
StatusInfo = GetStatusInfo(t.Key, false)
}
)
.OrderBy(sortBy)
.Skip(startRowIndex)
.Take(maximumRows)
.ToList();
return result;
}
}
你可以簡單地這樣做:
.Where(w => !onlyPresence || w.Even_Odd == 1)
就像是
using (LinqDataContext context = DataContext)
{
List<EmployeeInfo> result = context.vwDailyWorks
.Where(q => (q.Visible == true))
.Where(q => (q.DepartmentName.Contains(Department)))
.Where(q => (string.IsNullOrEmpty(name) ||
(q.FirstName.Contains(name) ||
q.LastName.Contains(name) ||
q.Position.Contains(name) ||
q.Floor.Contains(name) ||
(q.Ext_Tel ?? -1).ToString().Contains(name) ||
q.Email.Contains(name) ||
q.DepartmentName.Contains(name)))
);
if (onlyPresence)
{
result = result.Where(w => w.Even_Odd == 1 )
}
result = result
.GroupBy(t => t.EmployeeID)
.Select(t => new EmployeeInfo
{
FirstName = t.Max(s => s.FirstName),
LastName = t.Max(s => s.LastName),
Position = t.Max(s => s.Position),
DepartmentName = t.Max(s => s.DepartmentName),
Status2= GetPresent_Status(t.Key),
Extension = t.Max(s => s.Ext_Tel),
Info = GetPresenceInfo(t.Key, false),
ID = t.Key,
Email = t.Max(s => s.Email),
StatusInfo = GetStatusInfo(t.Key, false)
})
.OrderBy(sortBy)
.Skip(startRowIndex)
.Take(maximumRows)
.ToList();
return result;
}
首先, Queryable.Where 中的參數predicate
應該是一個Expression<Func<VwDailyWork,bool>>
。 或者用普通語言:一個接受 VwDailyWork 對象並返回一個 bool 的方法
w => { if (onlyPresence) { w.Even_Odd == 1}
不是Func<VwDailyWork,bool>
。 如果!onlyPresence
你想要什么? 根本不檢查?
w => !onlyPresence) || (w.Even_Odd == 1)
這與 af 相同: if (onlyPresence) return w.Even_odd == 1; 否則返回真;
如果您按照建議進行操作,則每次評估的 VwDailyWork 都會計算一次 onlyPresence 的值。 類似地,您多次檢查名稱是否為空。 只評估一次不是更好嗎?
IQueryable<VwDailyWorks> query = dbContext.vwDailyWorks
.Where(q => q.Visible && q.DepartmentName.Contains(Department);
if (!String.IsNullOrEmpty(name))
{
// add the name checks
query = query.Where(q => q.FirstName.Contains(name) || ...);
}
if (onlyPresence)
{
// add the check for even_odd == 1
query = query.Where(q => q.even_odd == 1);
}
現在您確定 name 和 onlyPresence 只檢查一次。
如果您經常這樣做,我的建議是為此創建一個擴展方法。 如果您不熟悉擴展方法,請參閱擴展方法揭秘
public static IQueryable<VwDailyWorks> QueryVwDailyWorks(
this LinqDataContext dbContext
string name,
string department,
bool onlyPresence)
{
IQueryable<VwDailyWorks> query = dbContext.vwDailyWorks
.Where(q => q.Visible
&& q.DepartmentName.Contains(Department);
if (!String.IsNullOrEmpty(name))
{
// add the name checks
query = query.Where(q => q.FirstName.Contains(name) || ...);
}
if (onlyPresence)
{
// add the check for even_odd == 1
query = query.Where(q => q.even_odd == 1);
}
}
return query;
}
用法:
string name = ...
string department = ...
bool onlyPresence = ...
using (var dbContext = new DataContext())
{
var result = dbContext.QueryVwDailyWorks(name, department, onlyPresence)
// continue with your original query
.GroupBy(t => t.EmployeeId)
.Select(...)
.OrderBy(...)
.Skip(...)
.Take(...)
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.