使用许多可选参数进行过滤并不起作用

时间:2018-01-14 13:28:26

标签: c# linq linq-to-sql

这是我的代码。 只有当第一个if语句(phoneNumber)不为null时,查询才能正常工作,但如果第一个if为null而其他parmenters不为null则会给我整个表

public static List<AllMember> SearchMember(string phoneNumber, string fName, string lName, string Tz, string empNum, string email, string dbName)
{
    try
    {
        using (var db = new DCardsDataContext(Organizations.GetConnectionStringByDbName(dbName)))
        {
            return db.AllMembers.Where(
                m =>
                 string.IsNullOrEmpty(phoneNumber) ? true : phoneNumber == m.PhoneNumber &&
                    string.IsNullOrEmpty(fName) ? true : fName == m.MemberFirstName &&
                     string.IsNullOrEmpty(lName) ? true : lName == m.MemberLastName &&
                      string.IsNullOrEmpty(Tz) ? true : Tz == m.TZ &&
                       string.IsNullOrEmpty(empNum) ? true : empNum == m.EmployeeNum &&
                        string.IsNullOrEmpty(email) ? true :  email == m.Email 
                ).ToList();
        }
    }
    catch (Exception ex)
    {
        Logger.Info($"error in SearchMember");
        Logger.Error(ex.Message);
    }
    return null;
}

1 个答案:

答案 0 :(得分:5)

首先,这几乎肯定是一个错误或括号和优先规则 - 添加更多括号应该使它“正常”:

(string.IsNullOrEmpty(phoneNumber) ? true : phoneNumber == m.PhoneNumber)
&& (string.IsNullOrEmpty(fName) ? true : fName == m.MemberFirstName)
&& (string.IsNullOrEmpty(lName) ? true : lName == m.MemberLastName)
...

但其次,这非常低效 - 它往往会产生非常昂贵的SQL。更好的方法是根据特定查询的实际需要撰写查询

IQueryable<Whatever> query = db.AllMembers;

if(!string.IsNullOrEmpty(phoneNumber))
    query = query.Where(m => m.PhoneNumber == phoneNumber);
if(!string.IsNullOrEmpty(fName))
    query = query.Where(m => m.MemberFirstName == fName);
if(!string.IsNullOrEmpty(lName))
    query = query.Where(m => m.MemberLastName == lName);
// ...

var results = query.Take(maxCount).ToList();