1

一貫性のあるGroupJoinをほとんど使用せずにObjectQueryを作成しようとしています。つまり、メインテーブルを1つ選択し、LEFTJOINを追加する必要があります。SelectManyメソッドを使用すると、フィールドRoleIDにアクセスできないため、次のように実行します。

var routesQuery = entities.Routes.Join(
                    entities.Locales,
                    Routes => Routes.LocaleID,
                    Locales => Locales.LocaleID,
                    (Routes, Locales) => new { Routes = Routes }
                ).GroupJoin(
                    entities.LinkRolesPermissions,
                    Routes => Routes.Routes.RouteID,
                    LinkRolesPermissions => LinkRolesPermissions.EntityID,
                    (Routes, LinkRolesPermissions) => new 
                    { 
                        LinkRolesPermissions = LinkRolesPermissions,
                        RoleID = LinkRolesPermissions.SelectMany(
                            LRS => LRS.RoleID,
                            (LRS, RoleID) => new { RoleID = LRS.RoleID }
                        )
                    }
                )
                .SelectMany(
                    LinkRolesPermissions => LinkRolesPermissions.RoleID, 
                    (LinkRolesPermissions, RoleID) => new { RoleID = RoleID }
                 ).GroupJoin(
                    entities.aspnet_Roles, 
                    LRS => LRS.RoleID, 
                    RLS => RLS.RoleId, 
                    (LRS, RLS) => new { LRS = LRS }
                );

すべてが機能していますが、何らかの方法でINNER JOINとして機能しています。私は、SelectManyメソッドがこの動作を引き起こすことに気付きました。このクエリを生成します:

SELECT  1 AS [C1],  1 AS [C2],  [Extent3].[RoleID] AS [RoleID] FROM   [dbo].[Routes] AS [Extent1] 
INNER JOIN [dbo].[Locales] AS [Extent2] ON ([Extent1].[LocaleID] = [Extent2].[LocaleID]) OR (([Extent1].[LocaleID] IS NULL) AND ([Extent2].[LocaleID] IS NULL)) 
INNER JOIN [dbo].[LinkRolesPermissions] AS [Extent3] ON ([Extent1].[RouteID] = [Extent3].[EntityID]) OR (([Extent1].[RouteID] IS NULL) AND ([Extent3].[EntityID] IS NULL))

私はそれを削除し、次のエラーが発生しました:

var routesQuery = entities.Routes.Join(
                    entities.Locales,
                    Routes => Routes.LocaleID,
                    Locales => Locales.LocaleID,
                    (Routes, Locales) => new { Routes = Routes }
                ).GroupJoin(
                    entities.LinkRolesPermissions,
                    Routes => Routes.Routes.RouteID,
                    LinkRolesPermissions => LinkRolesPermissions.EntityID,
                    (Routes, LinkRolesPermissions) => new 
                    { 
                        LinkRolesPermissions = LinkRolesPermissions,
                        RoleID = LinkRolesPermissions.SelectMany(
                            LRS => LRS.RoleID,
                            (LRS, RoleID) => new { RoleID = LRS.RoleID }
                        )
                    }
                )
                .GroupJoin(
                    entities.aspnet_Roles, 
                    LRS => LRS.RoleID, 
                    RLS => RLS.RoleId, 
                    (LRS, RLS) => new { LRS = LRS }
                );

メソッド'System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable、System.Func>、System.Func)'の型引数は、使用法から推測できません。タイプ引数を明示的に指定してみてください。

誰かが私にこの振る舞いを説明してくれませんか、そして可能であればそれを修正する方法をアドバイスしてください。

前もって感謝します。

4

2 に答える 2

1

関連するオブジェクトを熱心に読み込もうとしています。これを行うには、Include メソッドを使用します。

http://msdn.microsoft.com/en-us/library/bb896272.aspx

IQueryable<Route> query = 
  from route in entities.Routes.Include("LinkRolesPermissions.aspnet_Roles")
  where route.Locales.Any()
  select route;

これを機能させるには、ナビゲーション プロパティを設定する必要があります。

http://msdn.microsoft.com/en-us/library/bb738520.aspx


PS:毎回匿名型に投影する必要はありません:

(Routes, Locales) => new { Routes = Routes } 

になり得る

(Routes, Locales) => Routes
于 2010-10-27T16:35:36.373 に答える
0

まあ、LINQ を酷使し続けることは有益かもしれませんが、今ではそれは役に立たないように思われ、LINQ は 1 つのテーブルを含む短いクエリの場合にのみ適切なケースかもしれません。配列と XML、IMO 用に作成されました。

実際のSQL クエリの場合、次のように EF エンティティ内で初期化された直接 SQL クエリを使用する方がはるかに優れています。

ObjectQuery<DbDataRecord> query = new ObjectQuery<DbDataRecord>
(
"SELECT c.Name,c.City, d.Name FROM ContosoEntities.Customer as c " + 
"LEFT JOIN ContosoEntities.Products as d ON d.Name = c.Name " + 
"WHERE c.Country=@ctry", ent
);
query.Parameters.Add(new ObjectParameter("ctry", "Australia"));

ここにリストされているEFを使用するすべてのバリアント:

于 2011-02-26T12:36:56.727 に答える