簡體   English   中英

在 C# linq Lambda 表達式中使用 If

[英]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.

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