想要一个Guid?通过linq

时间:2013-08-21 14:59:11

标签: c# .net linq

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

我做错了什么?

7 个答案:

答案 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,请使用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();

答案 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)

您需要使用SingleSingleOrDefaultFirstFirstOrDefault方法。它们仅存在于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();