0

生成された SQL はクロス結合を行いますが、ID が一致すると内部結合のように機能しますが、C# で結合キーワードを実際に使用してこれを実行するより良い方法はありますか? とにかくプロパティがすべて階層的に関連しているため、プロパティの結合方法を指定する必要がない方法はありますか

アイテムは Page クラスです

PageRoles は 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();

編集:

これは、私のクラスの 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;
    }
}
4

3 に答える 3

0

私は Intellisense を持っていませんが、次のことができると思います。

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();
于 2009-06-26T16:16:27.683 に答える
0

これはコンパイルされますか、それともエラーが発生しますか?

この場合、あなたが述べたように、結合は必要ありません。私はこの構文を使用していませんが、参照として k を使用しているようです (SQL 構文のエイリアスのように)。

これは同じ結果をもたらすはずです(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();

注: テストされていません。推測にすぎません。

于 2009-06-26T16:21:24.330 に答える