用于选择记录的Linq查询

本文关键字:Linq 查询 记录 选择 用于 | 更新日期: 2023-09-27 18:19:18

我们使用以下代码片段根据名称propertycollection中选择特定的object

        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 '。' users 'vadiveln'documents'visual studio 2010'Projects'WindowsFormsApplication12'WindowsFormsApplication12'Program.cs 36 25 WindowsFormsApplication12C:'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查询

用于选择记录的Linq查询

应该和var temp = collection.FirstOrDefault(x => x.Name == s);一样简单

返回类型不同

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);

传递给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之前检查null值是一个好主意:

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

我不知道你想达到什么目的,但你完全做错了:)

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);

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

在ELSE中,你需要比较x.Names:

return x.Name.Equals(s);

,而不仅仅是

 return x.Name;

看起来您正在尝试获取名称等于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
              });