2009-06-26 3 views
0

生成されたSQLはクロス結合を行いますが、IDが一致するとインナー結合のように機能しますが、実際にC#でjoinキーワードを使用してこれを行う方が効率的ですか?それらは全てheirarchiclyとにかくIQueryableの構文は正しいですか?

項目が

PageRoles Pageクラスで関連しているので、あなたがプロパティに参加する方法を指定する必要はありませんそこの方法は、PageクラスでのIQueryableプロパティです

aspnet_Roles PageRoleクラスでのIQueryableプロパティです

var item = _repository.GetByKey(999); 

var f = (from fd in item.PageRoles 
     from k in fd.aspnet_Roles 
     where Roles.GetRolesForUser().Contains(k.RoleName) 
     && k.RoleId == fd.RoleId 
     select k.RoleName) 
     .Count(); 

EDIT:

次は、クラスのIQueryableプロパティの例です。例えば、以下のPageRoleクラスから

public IQueryable<aspnet_Role> aspnet_Roles 
{ 
    get 
    { 

      var repo=NorthCadburyWebsite.Models.aspnet_Role.GetRepo(); 
      return from items in repo.GetAll() 
       where items.RoleId == _RoleId 
       select items; 
    } 
} 

答えて

0

来る私は私と私のインテリセンスを持っていないが、私はあなたができると思う:

var f = (from fd in item.PageRoles 
     join k in fd.aspnet_Roles on k.RoleId equals fd.RoleId 
     where Roles.GetRolesForUser().Contains(k.RoleName) 
     select k.RoleName) 
     .Count(); 
+0

==を等号に変更すると、スワップするとfd.RoleIdが左側に、k.RoleIdが右側にありますが、これは正しいと思います。私はまだ結合の目的と階層Thoの目的のために頭を上げようとしています... –

+0

何らかの理由でfdを認識しないため、fd.aspnet_Rolesでjoin kを行うことはできません...? – Jon

+0

私は最初に正しいと思う... K.RoleIDは、イコールの前に最初に行く。 –

0

これは、コンパイルしたり、エラーが出るのでしょうか?

この場合、前述したように、参加する必要はありません。 私はこの構文を使用していないが、あなたは(SQL構文で別名のように)refererenceとしてKを使用するように見える

これは(さえkを用いずに)同じ結果を提供する必要があります。

var f = (from fd in item.PageRoles 
     where Roles.GetRolesForUser().Contains(fd.aspnet_Roles.RoleName) 
     && fd.aspnet_Roles.RoleId == fd.RoleId 
     select fd.aspnet_Roles.RoleName) 
     .Count(); 

注:テストされていない、ちょうど推測。

+0

fd.aspnet_Rolesはfd.aspnet_RoleNameはIQueryableであり、クラスのインスタンスではありません。 – Jon

-1

私はいかなる意味を作っていないクエリで次の階層を見ているので、私は、私は混乱していると思う:

 
[PageRoles] 
|--RoleId <~~~~~~~~~. 
|--[aspnet_Roles] | 
    |--RoleId ~~~~~~~* 
    |--RoleName 

RoleIdとだけで決まる階層です参照するためにPageRoles.RoleIdを意味する。aspnet_Roles.RoleId? ...

 
[PageRoles] 
|--RoleId 
|--[aspnet_Roles] (where RoleId == PageRoles.RoleId) 
    |--RoleName 

 
[PageRoles] [aspnet_Roles] 
|--RoleId |--RoleId 
      |--RoleName

そして、あなたは以下にそれを作るしようとしている:だからあなたのようなものを持っているのでしょうか?

あなたが次のことを行うことができない場合は、 何かがあなたのIQueryableプロパティ定義はなく、あなたが投稿したクエリで間違っている場合は

。つまり、PageRolesaspnet_Roles子行を取得する方法が正しく設定されていません。

var f = (from fd in item.PageRoles 
     from k in fd.aspnet_Roles 
     where Roles.GetRolesForUser().Contains(k.RoleName) 
     select k.RoleName) 
     .Count(); 

fd.aspnet_Roles既にRoleIdによって制約及び内部結合を生成しなければなりません)。

あなたはSQLから生成されたものを見て、あなたの階層を確認することができます。

SELECT k.RoleName, k.SomethingElse 
FROM PageRoles fd 
INNER JOIN aspnetRoles k ON fd.RoleId = k.RoleId; 

:(何かが投入されたアイテムに関係することで)漠然と似ているべき

var f = from fd in item.PageRoles 
     from k in fd.aspnet_Roles 
     select k; 

私は何かが欠けていると確信していますので、空白を記入してください...

+0

誰かがdownvoteについて説明したいですか? –

関連する問題