3

我需要从作为 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”

我究竟做错了什么?

4

7 回答 7

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;

如果您需要一个指南,请使用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();
于 2013-08-21T15:01:03.500 回答
1

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

.First()如果您只期待一个结果,或者.FirstOrDefault()您可能最终没有结果而您只想收到一个空值,请调用您的查询结果。

于 2013-08-21T15:01:08.680 回答
1

Enumerable.Select返回一个IEnumerable<T>which 是一个序列,因此通常是多个项目。如果您想使用第一项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();
于 2013-08-21T15:02:13.253 回答
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()
于 2013-08-21T15:01:28.473 回答
0

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

于 2013-08-21T15:02:01.963 回答
0

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

于 2013-08-21T15:02:06.647 回答
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();
于 2013-08-21T15:05:02.250 回答