0

我目前正在学习asp.net mvc 3,并且正在观看复数视线的课程视频,并且对某个代码感到好奇:

这里是:

 public ActionResult Index(string state)
        {
            //var restaurants = context.Restaurants.ToList();
            var restaurants = from r in context.Restaurants
                              where r.Address.State == state || (state == null)
                              select r;
            return View(restaurants);
        }

显然 state 参数是用来过滤查询的,所以如果 state = CA,那么只会检索 state 值为 CA 的行,我没有得到的部分是为什么要添加 || state == null 允许查询获取所有行。

这是另一个与上面的代码非常相似的代码:

var students = from s in studentRepository.GetStudents()
                           select s;
            if (!String.IsNullOrEmpty(searchString))
            {
                students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper())
                                       || s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));
            }

在这个中,它检查参数是否为空或 null,然后通过添加 where 子句来设置不同的查询。

那么当我添加那个 state == null 时实际发生了什么

先生/女士,您的回答会很有帮助。谢谢++

4

2 回答 2

2

这是简单的布尔逻辑:

r.Address.State == state || (state == null)

true || false -> true //(CA=CA)   ||(CA=null)
false|| true  -> true //(FL!=null)||(null=null)..null=null no matter the state from the database
false|| false -> false //(FL!=CA) ||(CA!=null)

由于在第二种情况下,它不检查数据库内的任何内容,因此它将始终返回 true,where因为它更多的是对传入参数的静态检查......这就是为什么你从查询中获取所有内容的原因。

我假设这样做的目的是使参数仅在提供时才像过滤器一样起作用。如果未提供,则不应用过滤器,因为(null==null)

在第二个示例中,它本质上是在做与上面相同的事情。它甚至没有将静态检查构建到 LINQ 中。

它可以很容易地写成:

from s in studentRepository.GetStudents()
where String.IsNullOrEmpty(searchString) || 
    s.LastName.ToUpper().Contains(searchString.ToUpper()) ||                                       
    s.FirstMidName.ToUpper().Contains(searchString.ToUpper())
select s;

同样,由于布尔 OR 逻辑,对参数的检查将覆盖任何数据检查

这是以与第二个类似的方式编写的第一个查询

var restaurants = from r in context.Restaurants
    select r;
if(state != null)
    restaurants = restaurants.Where(x=>x.Address.State == state);

这是一个关于布尔逻辑的链接,如果你用谷歌搜索的话,实际上有很多。

于 2013-02-19T17:53:33.493 回答
1

在第一个示例中: || 是一个 OR 运算符,如果状态为空,查询将是状态是什么或。这并不一定意味着它将返回所有记录。所以返回将是状态和那些为空的。

第二个例子只是检查是否有搜索条件可供参考。
基本上:如果我有搜索条件,则获取姓氏包含搜索条件或名字具有搜索条件的记录。

说得通?您只是试图根据某种条件撤回记录......也许他们想要拥有与某个状态匹配或为空的记录......然后对它们执行一些操作。

于 2013-02-19T17:57:45.597 回答