我需要从Table1获取id值,这是一个Guid。此查询也可以返回null。所以我开始关注
Guid? SomeID = from R in Table1
join P in Table2
on R.Id equals P.Id2
where R.Name == 'blah blah'
select R.Id;
但是我遇到了编译错误。
无法隐式转换类型'System.Linq.IQueryable' 到'System.Guid?'
改变Guid?对Guid没有帮助。
Guid SomeID = from R in Table1
join P in Table2
on R.Id equals P.Id2
where R.Name == 'blah blah'
select R.Id;
现在我得到以下错误。
无法隐式转换类型'System.Linq.IQueryable' 到'System.Guid'
我做错了什么?
答案 0 :(得分:2)
您的查询会返回所有匹配的guid,并且类型为IQueryable<Guid?>
IQueryable<Guid?> guids =
from R in Table1
join P in Table2
on R.Id equals P.Id2
where R.Name == 'blah blah'
select R.Id;
如果您需要一个guid,请使用First
,Single
,FirstOrDefault
或SingleOrDefault
Guild? guid = guids.FirstOrDefault();
或单一声明:
Guid? guid = Table1.Where(R => R.Name == "blah")
.Join(Table2, R => R.Id, P => P.Id2, (R,P) => R.Id)
.FirstOrDefault();
混合语法(遗憾的是,查询语法中没有FirstOrDefault
运算符的等价物):
Guid? guid = (from R in Table1
join P in Table2
on R.Id equals P.Id2
where R.Name == 'blah blah'
select R.Id).FirstOrDefault();
答案 1 :(得分:1)
该LINQ语句的返回值是 GUID列表。具体来说,是IEnumerable<Guid>
。
如果您只是期待一个结果,请在查询结果上调用.First()
,如果最终没有结果,则调用.FirstOrDefault()
,而您只想收到空。
答案 2 :(得分:1)
Enumerable.Select
返回IEnumerable<T>
这是一个序列,通常是多个项目。如果您希望第一项使用First
或(如果它可以为空)FirstOrDefault
:
Guid? SomeID = (from R in Table1
join P in Table2
on R.Id equals P.Id2
where R.Name == 'blah blah'
select R.Id).First();
答案 3 :(得分:0)
(from R in Table1
join P in Table2
on R.Id equals P.Id2
where R.Name == 'blah blah'
select R.Id).FirstOrDefault() //or .SingleOrDefault()
答案 4 :(得分:0)
IQueryable表示某种商店(例如SQL Server)的查询,并且可能返回0,1行或更多行。你正试图得到其中一个。获取单行使用方法,如First / FirstOrDefault或Single / SingleOrDefult
答案 5 :(得分:0)
您需要使用Single或SingleOrDefault或First或FirstOrDefault方法。它们仅存在于lambda语法中。如果您希望一个结果使用Single,如果为1或0,则使用SingleOrDefault。
答案 6 :(得分:0)
试试此代码
使用as Guid
看下面:
Guid SomeID = (from R in Table1
join P in Table2
on R.Id equals P.Id2
where R.Name == 'blah blah'
select R.Id).First() as Guid;
或尝试
Guid SomeID = (Guid) from R in Table1
join P in Table2
on R.Id equals P.Id2
where R.Name == 'blah blah'
select R.Id).First();