试图获取Guid?通过linq

本文关键字:通过 linq Guid 获取 | 更新日期: 2023-09-27 18:28:26

我需要从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"

我做错了什么?

试图获取Guid?通过linq

您的查询返回所有匹配的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,请使用FirstSingleFirstOrDefaultSingleOrDefault

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

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

该LINQ语句的返回值是GUID的列表。具体地,一个IEnumerable<Guid>

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

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

IQueryable表示对某种存储(例如SQL Server)的查询,并且可能返回0,1或更多行。你正试图得到其中一个。要获得单行,请使用First/FirstOrDefault或single/SingleOrDefult 等方法

您需要使用Single或SingleOrDefault或First或FirstOrDefault方法。它们只存在于lambda语法中。如果希望得到一个结果,请使用Single,如果是1或0,则使用SingleOrDefault。

试试这个代码

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