什么是此查询的lambda等价物

时间:2012-07-25 09:35:26

标签: c# lambda

假设在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进行此类查询的正确方法吗?

欢迎任何建议。

5 个答案:

答案 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);
}