这两种方法之间的区别是返回相同的值吗?

时间:2014-05-30 19:55:54

标签: c# asp.net-mvc linq

你们可以告诉我这些方法之间的区别吗?

public IHttpActionResult GetBookings(int id)
        {
            Bookings bookings = db.Bookings.Find(id);

            if (bookings == null)
        {
            return NotFound();
        }

        return Ok(bookings);
    }

public IHttpActionResult GetBookings(int id)
        {


            Bookings bookings = (from tbBooking in db.Bookings
                                 where tbBooking.BookingsID == id
                                select new Bookings
                             {
                                 BookingsID = tbBooking.BookingsID,
                                 CheckinDate = tbBooking.CheckinDate,
                                 CheckoutDate = tbBooking.CheckoutDate,
                                 CheckedIn = tbBooking.CheckedIn,
                                 Room = tbBooking.Room,
                                 HostelID = tbBooking.HostelID,
                                 UserID = tbBooking.UserID
                             }).FirstOrDefault();

        if (bookings == null)
        {
            return NotFound();
        }

        return Ok(bookings);
    }

所以第一个运行正常,但第二个方法返回以下错误

  

类型' System.NotSupportedException'的例外情况发生在mscorlib.dll中,但未在用户代码中处理

     

附加信息:实体或复杂类型' MyProject.Models.Bookings'不能在LINQ to Entities查询中构造。

他们都没有退回预订对象,因此应该是相同的吗?

我问的原因是我不断得到一个"序列包含多个元素"当在Azure上部署时使用第一个方法时出错,但是在本地运行时运行正常,所以我发现了一些网站,我发现第一个orrrfault()到LINQ查询,所以我必须包含linq查询但是我的问题现在是上面的错误。

Ahy的想法/建议会很棒!

3 个答案:

答案 0 :(得分:2)

从逻辑上讲,没有任何区别可以从数据库中找到具有该特定条件的记录。

在第二种情况下,您可以在一行中执行此类操作,具有更高的可读性,而不是编写如此多的行:

Bookings bookings = db.Bookings.FirstOrDefault(x=>x.BookingsID == id);

或者如果你想这样做那么你也可以这样做:

Bookings bookings = (from tbBooking in db.Bookings
                     where tbBooking.BookingsID == id
                     select tbBooking).FirstOrDefault();

不需要创建新对象,因为属性都是相同的,也是类型。

答案 1 :(得分:1)

  1. 逻辑上,没有区别。
  2. 表现明智,第一个更好,因为第二个重复选择
  3. 可读性/维护方面,第一个更好,因为它更易读,更易于维护
  4. overll,第一个更好

答案 2 :(得分:-1)

在第一种情况下,

  

预订预订= db.Bookings.Find(id);

这不是正确的做法。查找应该具有与参数相同的对象作为对象列表。

例如: db.Bookings是List<预订>

那么代码应该是这样的

Bookings bookings = db.Bookings.Find(bookingsObj);

OR

Bookings bookings = db.Bookings.Find(x=> x.BookingsID==id);