Linq查询选择记录

时间:2013-06-20 14:52:25

标签: c# linq

我们使用以下代码段根据名称objectcollection中选择特定的property

        ObservableCollection<Test> collection = new ObservableCollection<Test>();
        collection.Add(new Test() { Id =1, Name ="Nestor"});
        collection.Add(new Test() { Id = 2, Name = "Rohan" });
        collection.Add(new Test() { Id = 3, Name = "Guy" });
        collection.Add(new Test() { Id = 4, Name = "Mike" });

        string s = "Rohan";
        var temp = collection.FirstOrDefault(x =>
            {
                if (x.Name != null)
                {
                    return x.Name.ToString().Equals(s);
                }
                else
                {
                    return x.Name;
                }
            });

我们在此代码段中收到以下错误。

错误:

  

错误1无法将lambda表达式转换为委托类型'System.Func',因为块中的某些返回类型不能隐式转换为委托返回类型C:\ Users \ vadiveln \ documents \ visual studio 2010 \ Projects \ WindowsFormsApplication12 \ WindowsFormsApplication12 \ Program.cs 36 25 WindowsFormsApplication12   错误2无法将类型'string'隐式转换为'bool'C:\ Users \ vadiveln \ documents \ visual studio 2010 \ Projects \ WindowsFormsApplication12 \ WindowsFormsApplication12 \ Program.cs 36 32 WindowsFormsApplication12

您能否请一看,并提供使用Linq query正确方法的建议。提前谢谢。

以下修改后的代码:

        ObservableCollection<Test> collection = new ObservableCollection<Test>();
        collection.Add(new Test() { Id = 1 });
        collection.Add(new Test() { Id = 2, Name = "Rohan" });
        collection.Add(new Test() { Id = 3, Name = "Guy" });
        collection.Add(new Test() { Id = 4, Name = "Mike" });

        string s = "Rohan";
        var temp = collection.FirstOrDefault(x =>
        {
            return x.Name.Equals(s);               

        });

我们在底层集合中使用了null字段。那么如何使用linq查询

6 个答案:

答案 0 :(得分:1)

它应该像var temp = collection.FirstOrDefault(x => x.Name == s);

一样简单

答案 1 :(得分:1)

返回类型不同。

if (x.Name != null)
{
    return x.Name.ToString().Equals(s); // returns bool
}
else
{
    return x.Name; // returns string (or null)
}

您可能需要的是:

collection.FirstOrDefault(x => x == s);

答案 2 :(得分:0)

传递给FirstOrDefault的lambda表达式需要返回一个布尔值。试试这个:

string s = "Rohan";
var temp = collection.FirstOrDefault(x => (x.Name != null) &&
                                          (x.Name.Equals(s)));

或更简单:

var temp = collection.FirstOrDefault(x => x.Name == s);
如果找不到符合您条件的项目,

FirstOrDefault可以返回null,因此在使用temp之前检查空值是个好主意:

if (temp == null)
{
    // not found...
}

答案 3 :(得分:0)

看起来您正在尝试获取名称等于Rohan的第一个项目:

// Name is string, you don't need to call ToString() for comparison
var temp = collection.FirstOrDefault(x => x.Name == s);

您当前的查询有什么问题? FirstOrDefault方法需要谓词参数,该参数返回布尔结果。但是目前你正试图从谓词中返回字符串x.Name

var temp = collection.FirstOrDefault(x =>
    {
        if (x.Name != null)
        {
            // this is OK, you are returning boolean                
            return x.Name.ToString().Equals(s);
        }
        else
        {
            // instead of return x.Name which is string
            return false;
        }
    });

您修改的代码会引发错误,因为集合中的某些对象的Name属性可能等于null。当您尝试拨打null.Equals(s)时,您会收到NullReferenceException。要解决此问题,只需比较两个字符串:

   var temp = collection.FirstOrDefault(x => 
              {
                  //return x.Name.Equals(s);
                  return x.Name == s; // will not throw if name is null
              });

答案 4 :(得分:0)

我不知道你想要实现什么,但你完全做错了:)

var temp = collection.FirstOrDefault(x =>
    {
        if (x.Name != null)
        {
            // this part returns bool
            return x.Name.ToString().Equals(s);
        }
        else
        {
            // this one returns string
            return x.Name;
        }
    });

我认为你在这里寻找非常简单的FirstOrDefault(x => x == s);

答案 5 :(得分:0)

FirstOrDefault接受一个委托,该委托对集合中的每个元素都返回TRUE或FALSE。

在您的ELSE中,您需要将x.Names进行比较:

return x.Name.Equals(s);

,而不仅仅是

 return x.Name;