使用 LINQ 处理空字符串

6

我有一个linq语句,根据表单中的用户输入搜索多个字段。只需要一个表单字段,因此我需要处理空字符串值。最好的处理方式是什么?我应该检查字符串的长度,然后将相关变量设置为null,并在linq语句中检查这一点,还是可以在linq语句中做些什么。我的方法如下:

     public IEnumerable<Job> GetJobs(string jobNumber, string jobName, string projectDirectorName, string projectManagerName, string groupName) {
        return this._context.Jobs.Where(
            j => j.JobNumber.Contains(jobNumber) ||
                 j.JobName.Contains(jobName) ||
                 j.ProjectDirectorFullName.Contains(projectDirectorName) ||
                 j.GroupName.Contains(groupName));
    }

如果将变量设置为 null,那么 Contains() 将会抛出一个异常。 - svick
@svick 当然,但我会在我的陈述中检查这一点。只是想知道其他人是如何处理这个问题的。 - Richard Banks
7个回答

8
你可以使用这个:
 public IEnumerable<Job> GetJobs(string jobNumber, string jobName, string projectDirectorName, string projectManagerName, string groupName) {
    IQueryable<Job> query = this._context.Jobs;

    if (!String.IsNullOrEmpty(jobNumber))
       query = query.Where(j => j.JobNumber.Contains(jobNumber));

    if (!String.IsNullOrEmpty(jobname))
       query = query.Where(j => j.JobName.Contains(jobName));

    // etc.

    return query;
}

如果这将查询数据库,那么只有在迭代此方法的结果时,该数据库才会被查询,而不是每个“.Where”都会查询。

0

你可以尝试使用

string.IsNullOrWhiteSpace(yourString);  // .NET 4.0

或者

string.IsNullOrEmpty(yourString);

如果是真的,返回一个空集合。


0

像这样怎么样:

if (!string.IsNullOrWhiteSpace(jobNumber)) return _context.Jobs.Where(j => j.JobNumber.Contains(jobNumber));
if (!string.IsNullOrWhiteSpace(jobName)) return _context.Jobs.Where(j => j.JobName.Contains(jobName));
if (!string.IsNullOrWhiteSpace(projectDirectorName)) return _context.Jobs.Where(j => j.ProjectDirectorFullName.Contains(projectDirectorName));
if (!string.IsNullOrWhiteSpace(groupName)) return _context.Jobs.Where(j => j.GroupName.Contains(groupName));
else throw new ArgumentException ("No arguments specified");

或者是一些读起来更好的东西:

if (!string.IsNullOrWhiteSpace(jobNumber)) return FilterJobsByNumber(jobNumber);
if (!string.IsNullOrWhiteSpace(jobName)) return FilterJobsByName(jobName);
if (!string.IsNullOrWhiteSpace(projectDirectorName)) return FilterJobsByDirector(projectDirectorName);
if (!string.IsNullOrWhiteSpace(groupName)) return FilterJobsByGroupName(groupName);
else throw new ArgumentException ("No arguments specified");

对于适当定义的FilterJobsByNumber等。


0

或许它可以帮助。

    public IEnumerable<Job> GetJobs(string jobNumber, string jobName, string projectDirectorName, string projectManagerName, string groupName) {
    return this._context.Jobs.Where(
        j => (j == null || j.JobNumber.Contains(jobNumber)) ||
             (j == null || j.JobName.Contains(jobName));
}

-1

应该使用

String.IsNullOrWhitespaceTrim()

请查看我的代码

 NorthwindDataContext db= new NorthwindDataContext();
               db.Log = sw;
               var oList = db.Categories
                   .Where(j =>
                            ( string.IsNullOrWhiteSpace(txtName.Text) || j.CategoryName.StartsWith(txtName.Text.Trim()))
                            &&
                            (string.IsNullOrWhiteSpace(txtDescription.Text) || j.Description.StartsWith(txtDescription.Text.Trim()))   
                          )
                   .Select(p => new { Name = p.CategoryName ,Description =p.Description }).ToList();  

-2

我认为使用String.IsNullOrWhitespace检查是最好的。


我不知道你在说什么,但我没有给你的答案点踩。我的回答实在太老了,与这个主题不符。我想他们之后修改了问题,否则我不会建议这个答案。但我从来没有给这个主题下过其他答案的赞。 - Felix C

-3
假设您在进入此代码块之前已经对搜索词应用了 .Trim(),请按以下方式修改代码:
public IEnumerable<Job> GetJobs(string jobNumber, string jobName, string projectDirectorName, string projectManagerName, string groupName) {
        return this._context.Jobs.Where(
            j => (j.JobNumber.Contains(jobNumber) && jobNumber!="")  ||
                 (j.JobName.Contains(jobName) && jobName != "") ||
                 (j.ProjectDirectorFullName.Contains(projectDirectorName) 
                      && projectDirectorName != "") ||
                 (j.GroupName.Contains(groupName) && groupName!=""));
    }

这里的重点是您不需要在搜索条件中添加if条件。您可能有多个搜索字段,但它仍然可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接