返回id包含在列表中的实体

时间:2014-01-28 14:26:20

标签: c# linq entity-framework contains

我正在尝试做一些类似SQL'in'的内容,我理解它或多或少等同于LINQ中的'contains'。

这是我在阅读了几个其他类似的问题之后想出来的问题...... http://blogs.msdn.com/b/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx

public ActionResult recentbookings(string recent_bookings)
{
    List<booking> bookings = db.bookings.Where(s => recent_bookings.Contains("36525")).ToList();
    return PartialView("_recentbookings", bookings);
}

此查询返回表中的每条记录。 我希望并期望查询返回一个与我传入的id匹配的记录。

'recent_bookings'值来自localstorage,通过javascript调用...

var url = '@Url.Action("recentbookings", "booking")';
url += "?recent_bookings="+ localStorage['recent_bookings'];
$("#ajaxresult").load(url);

本地存储中只有一个项目,即“36525”,与我查询中硬编码的“包含(”36525“)匹配。

我相信我的查询逻辑存在一个简单的问题,因为与SQL相比,我并不理解它。

一旦我解决了这个问题,我将继续解析传入字符串中的多个值。

1 个答案:

答案 0 :(得分:4)

public ActionResult recentbookings(string recent_bookings)
{
    var recent_bookings_array = new[] { int.Parse(recent_bookings) };
    booking[] bookings = db.bookings.Where(s => 
        recent_bookings_array.Contains(s.Id)).ToArray();
    return PartialView("_recentbookings", bookings);
}

你正在使用.Contains错误。你是对的,它就像一个IN子句,但你调用的对象.Contains应该像你的SQL查询的IN (36525)部分。上面的查询基本上是说“给我所有的预订ID都在这个最近的预订ID列表中的预订。”

为什么您的结果会返回所有预订记录?

...因为Where子句参数是Func<T, bool>。意思是,lambda表达式的结果必须是true或false。您的问题中的表达式s => recent_bookings.Contains("36525")将始终返回true,因为字符串“36525”包含在您的recent_bookings变量中。由于它始终为true,因此返回所有行。您从未根据数据检查过任何内容,只检查了您的本地变量。

另外请注意,除非在返回视图之前需要向/从中添加/删除项目,否则不要在结果上调用.ToList。 .ToArray要快得多,但会返回一个不可变的集合。