Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图获取Guid?林克大道_C#_.net_Linq - Fatal编程技术网

C# 试图获取Guid?林克大道

C# 试图获取Guid?林克大道,c#,.net,linq,C#,.net,Linq,我需要从表1中获取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没有帮

我需要从表1中获取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”


我做错了什么?

您的查询返回所有匹配的GUID,并且它的类型为
IQueryable

或在单个语句中:

Guid? guid = Table1.Where(R => R.Name == "blah")
                   .Join(Table2, R => R.Id, P => P.Id2, (R,P) => R.Id)
                   .FirstOrDefault();
混合语法(遗憾的是,查询语法中没有与
FirstOrDefault
运算符等效的语法):


该LINQ语句的返回值是GUID列表。具体来说,
IEnumerable


如果您只希望得到一个结果,请对查询结果调用
.First()
;如果您可能最终没有结果,只希望接收空值,请调用
.FirstOrDefault()

IQueryable表示对某种存储(例如SQL Server)的查询,并且可能返回0,1或更多行。你正试图得到其中一个。要获取单行,请使用First/FirstOrDefault或single/singleOrdEvent等方法,您需要使用或或或方法。它们仅以lambda语法存在。如果希望得到一个结果,请使用Single,如果为1或0,则使用SingleOrDefault。

可枚举。Select
返回一个
IEnumerable
,这是一个序列,因此通常是多个项。如果需要第一项,请使用
first
或(如果可以为空)
first或default

(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()
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();
试试这个代码

使用
作为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();

如果一个结果是预期的单一是更好的。它可能会更好,也可能不会更好地使用单一。获得多个结果是否是异常情况完全取决于此代码的周围环境,尽管作者确实暗示他期望一个或零(在零的情况下,
First
Single
都会导致异常)。您的代码将解决此转换问题吗?我认为这是一个转换问题。是吗?@RameshRajendran:我已经试着解释了这个问题。linq查询返回一个
IEnumerable
,这是所有集合类型实现的接口。所以基本上它是一种用于多个项目的类型。但是您需要一个
Guid
。因此,您要么必须更改类型(例如,
IEnumerable ID=..
),要么必须使用
First/FirstOrDefault/Single/SingleOrDefault
来获取一项。噢!我理解。谢谢。你的代码可以解决这个转换问题吗?我认为这是一个转换问题。对吗?@RameshRajendran不,Id是表中的Guid。将
IQueryable
分配给
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();
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();