用于选择记录的Linq查询
本文关键字:Linq 查询 记录 选择 用于 | 更新日期: 2023-09-27 18:19:18
我们使用以下代码片段根据名称property
从collection
中选择特定的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查询
应该和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.Name
和s
:
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
});