0

我在映射时遇到问题。我正在阅读“数据整形功能”的 scottGU 帖子 - http://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx

但我试过这个

      IQueryable<AccessRights> accessRights = 
                            from t1 in this.db.AccessRights
                            join t2 in this.db.AccessRightsExtra
                            on t1.IdAccessRights equals t2.IdAccessRights 
                            where t2.IdUser== userId
                            select new AccessRights
                            {
                                IdAccessRights = t1.IdAccessRights,
                                Description= t2.Description
                            };

但会产生此错误“不允许在查询中显式构造实体类型'#some type#'”

根据上面链接中的 scottgus 帖子,我也尝试过(注意在新的选择之后缺少类型)

     IQueryable<AccessRights> accessRights = 
                            from t1 in this.db.AccessRights
                            join t2 in this.db.AccessRightsExtra
                            on t1.IdAccessRights equals t2.IdAccessRights 
                            where t2.IdUser== userId
                            select new
                            {
                                IdAccessRights = t1.IdAccessRights,
                                Description= t2.Description
                            };

但这会产生

无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IQueryable”。存在显式转换(您是否缺少演员表?)

非常感谢任何人的任何见解。

4

2 回答 2

4

怎么样:

 IEnumerable<AccessRights> accessRights = 
    // This bit works in the database
    (from t1 in this.db.AccessRights
    join t2 in this.db.AccessRightsExtra
    on t1.IdAccessRights equals t2.IdAccessRights 
    where t2.IdUser== userId
    select new
    {
        IdAccessRights = t1.IdAccessRights,
        Description= t2.Description
    })
    .AsEnumerable() // From here on it's in-process
    .Select(x => new AccessRights
            {
                IdAccessRights = x.IdAccessRights,
                Description= x.Description
            });

请注意,结果是IEnumerable<T>而不是IQueryable<T>,但它仍会被延迟评估。这会导致问题吗?

或者,只需使用隐式类型的局部变量来使用匿名类型:

var accessRights = from t1 in this.db.AccessRights
                   join t2 in this.db.AccessRightsExtra
                   on t1.IdAccessRights equals t2.IdAccessRights 
                   where t2.IdUser== userId
                   select new
                   {
                       IdAccessRights = t1.IdAccessRights,
                       Description= t2.Description
                   };

这仍然是一个匿名类型,IQueryable<T>但 whereT是一个匿名类型。您将无法将其用作 anIQueryable<AccessRights>但如果您只需要IdAccessRightsandDescription属性,并且您只需要以相同的方法使用它们,那么它可能对您来说已经足够了......

于 2009-09-22T08:20:50.887 回答
0

有可能,如果您创建一个没有 [Table]-Attribute 的新派生类,如下所示:

public class AccessRightsLocal : AccessRights
{
}

然后您可以在选择中创建“AccessRightsLocal”的实例。将新实例转换为“AccessRights”,它将起作用!

IQueryable<AccessRights> accessRights = 
                    from t1 in this.db.AccessRights
                    join t2 in this.db.AccessRightsExtra
                    on t1.IdAccessRights equals t2.IdAccessRights 
                    where t2.IdUser== userId
                    select (AccessRights) new AccessRightsLocal
                    {
                        IdAccessRights = t1.IdAccessRights,
                        Description= t2.Description
                    };
于 2013-10-17T06:02:40.077 回答