2

假设在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

欢迎任何建议。

4

5 回答 5

4

鉴于您只是在过滤、执行身份转换,然后使用,您可以通过使用predicate的重载SingleOrDefault来完成所有操作:SingleOrDefault

using (var db = new DataClasses1DataContext())
{
    var result = db.MyTable.SingleOrDefault(myTable => myTable.SomeCondition);
    // Use result...
}

(如果这样更好,您可以FirstOrDefault在此处使用。)

于 2012-07-25T09:44:47.390 回答
3

请问这部分有必要吗?

.Select(myTable=>myTable)

答案是不。它将项目列表转换为相同项目的列表。拉姆达:

x => x

是“身份函数”,准确地返回它所传递的内容。

注意

其他一些答案建议FirstOrDefault作为SingleOrDefault. 如果查询可能返回多条记录,而您没有OrderBy子句,那么数据库可能会以随机顺序返回结果。所以使用FirstOrDefault就像说“随机选择一个”。

如果所有记录都“足够好”(在某种意义上),那可能没问题。如果不是,您应该添加一个OrderBy子句,以便第一条记录是“最佳”记录。或者您可能想对符合您条件的每条FirstOrDefault记录执行操作,在这种情况下,既不使用也不使用 SingleOrDefault`。只需遍历结果。

最后(基于下面的评论)如果您只想知道是否有匹配的记录,但不想检查其内容,请使用Any.

于 2012-07-25T09:38:00.580 回答
2

你可以这样使用:

使用(var db=new DataClasses1DataContext())

{

var result=db.MyTable.Where(x=>x.SomeCondition.Equals(true));

}

现在你会得到结果

于 2012-07-25T09:46:16.020 回答
1

如果您不想投影表格,您甚至不需要选择:

using(var db=new DataClasses1DataContext())
{
    var result=db.MyTable.Where(myTable => myTable.SomeCondition);
}
于 2012-07-25T09:37:52.360 回答
1

无需在语句末尾添加以下代码。

SingleOrDefault()

为此使用以下代码。

using(var db=new DataClasses1DataContext())
{
    var result=db.MyTable.Where(myTable=>myTable.SomeCondition);
}
于 2012-07-25T09:45:05.943 回答