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#' in query is not allowed」が生成されます

上記のリンクの 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>が、Tは匿名型です。これを として使用することはできませんがIQueryable<AccessRights>、必要なのがIdAccessRightsDescriptionプロパティだけで、同じメソッドでのみ必要な場合は、それで十分かもしれません...

于 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 に答える