我正在尝试做一些类似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相比,我并不理解它。
一旦我解决了这个问题,我将继续解析传入字符串中的多个值。
答案 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要快得多,但会返回一个不可变的集合。