这是我的代码。 只有当第一个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;
}
答案 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();