【问题标题】:Trying to get a Guid? via linq试图获得指导?通过 linq
【发布时间】:2013-08-21 14:59:10
【问题描述】:

我需要从作为 Guid 的 Table1 中获取 id 值。此查询也可以返回 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 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'

我做错了什么?

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    您的查询返回所有匹配的 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();
    

    【讨论】:

    • 你的代码能解决这个转换问题吗?我认为这是一个转换问题。对吗?
    • @RameshRajendran nope,Id 是表中的 Guid。将IQueryable&lt;Guid?&gt; 分配给Guid? 类型的变量存在问题
    【解决方案2】:

    Enumerable.Select 返回一个IEnumerable&lt;T&gt;,它是一个序列,因此通常是多个项目。如果您想要第一项,请使用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();
    

    【讨论】:

    • 你的代码能解决这个转换问题吗?我认为这是一个转换问题。对吗?
    • @RameshRajendran:我试图解释这个问题。 linq 查询返回一个IEnumerable&lt;Guid&gt;,它是所有集合类型实现的接口。所以基本上它是一种用于多个项目的类型。但是你想要一个Guid。因此,您要么必须更改类型(例如 IEnumerable&lt;Guid&gt; ids = ....),要么必须使用 First/FirstOrDefault/Single/SingleOrDefault 来获取一项。
    • 哦!我明白 。谢谢。
    【解决方案3】:

    该 LINQ 语句的返回值是 GUID 列表。具体来说,IEnumerable&lt;Guid&gt;

    如果您只希望得到一个结果,请在查询结果上调用.First(),或者如果您最终可能没有结果并且只想收到一个空值,请致电.FirstOrDefault()

    【讨论】:

    • 如果一个结果是预期的单身更好。
    • 使用 Single 可能会更好,也可能不会更好。获得多个结果是否是异常情况完全取决于这段代码的上下文,尽管作者确实暗示他期望一个或零(在零的情况下,FirstSingle 都会导致异常)。
    【解决方案4】:
    (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()
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        您需要使用SingleSingleOrDefaultFirstFirstOrDefault 方法。它们仅存在于 lambda 语法中。如果您期望一个结果使用 Single,如果是一或零,则使用 SingleOrDefault。

        【讨论】:

          【解决方案7】:

          试试这个代码

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-02-28
            • 2012-03-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-06
            • 1970-01-01
            相关资源
            最近更新 更多