假设在SQL
我试图运行此查询
Select * from MyTable where SomeCondition=true
我目前正在将此lambda表达式用于上述查询
using(var db=new DataClasses1DataContext())
{
var result=db.MyTable.Where(myTable=>myTable.SomeCondition.Equals(true)).SingleOrDefault();
}
这是正确的方法还是我应该做这样的事情
using(var db=new DataClasses1DataContext())
{
var result=db.MyTable.Where(myTable=>myTable.SomeCondition.Equals(true)).Select(myTable=>myTable).SingleOrDefault();
}
有人可以建议我在Lambda
进行此类查询的正确方法吗?
欢迎任何建议。
答案 0 :(得分:4)
鉴于您只是过滤,执行身份转换,然后使用SingleOrDefault
,您可以使用overload of SingleOrDefault
which takes a predicate完成所有操作:
using (var db = new DataClasses1DataContext())
{
var result = db.MyTable.SingleOrDefault(myTable => myTable.SomeCondition);
// Use result...
}
(如果更好的话,可以在这里使用FirstOrDefault
。)
答案 1 :(得分:3)
你在问这个部分是否必要吗?
.Select(myTable=>myTable)
答案是否定的。它将项目列表转换为相同项目的列表。 lambda:
x => x
是“身份功能”,正好返回传递的内容。
NB
其他一些答案建议FirstOrDefault
替代SingleOrDefault
。如果查询可能返回多个记录,并且您没有OrderBy
子句,则数据库可能会以随机顺序返回结果。因此,使用FirstOrDefault
就像是说“随机选择一个”。
如果所有记录都“足够好”(在某种意义上),这可能没问题。如果没有,您应该添加OrderBy
子句,以便第一条记录是“最佳”记录。或者您可能希望对符合条件的每条记录执行操作,在这种情况下既不使用FirstOrDefault
也不使用SingleOrDefault`。只需循环结果。
最后(基于下面的评论)如果您只是想知道是否有匹配的记录,但您不想检查其内容,请使用Any
。
答案 2 :(得分:2)
您可以这样使用:
使用(var db = new DataClasses1DataContext())
{
var result=db.MyTable.Where(x=>x.SomeCondition.Equals(true));
}
现在你将得到结果
答案 3 :(得分:1)
如果您不想投影该表,您甚至不需要选择:
using(var db=new DataClasses1DataContext())
{
var result=db.MyTable.Where(myTable => myTable.SomeCondition);
}
答案 4 :(得分:1)
无需在声明末尾添加以下代码。
SingleOrDefault()
使用以下代码。
using(var db=new DataClasses1DataContext())
{
var result=db.MyTable.Where(myTable=>myTable.SomeCondition);
}