1

Sql Server 2012 と .NET 4 を使用しています

C# に変換したい Sql は次のようになります。

SELECT rd.Name, rd.Description, prdv.Value
FROM RoleDetail rd 
    JOIN Role r ON r.RoleID = rd.RoleID
    JOIN PersonRole pr ON pr.RoleID = r.RoleID
    LEFT OUTER JOIN PersonRoleDetailValue prdv ON prdv.RoleDetailID = rd.RoleDetailID
WHERE pr.PersonID = 42

何度か試みて多くの時間を無駄にした後、私は始めたときよりも良くなったようには見えません. どんな助けでも大歓迎です。

私はメソッド構文を好みますが、クエリ構文ソリューションも大歓迎です。

ソリューション(以下のDavid Bの回答に感謝します)

以下は両方の実用的なソリューションです。他の人が恩恵を受けることを願っています...

メソッドの構文:

var methodSyntax = db.PersonRoles
    .Where(pr => pr.PersonID == 42)
    .SelectMany(pr => pr.Role.RoleDetails)
    .SelectMany(rd => rd.PersonRoleDetailValues.DefaultIfEmpty(), (rd, prdv) => new
        {
            Name = rd.Name,
            Description = rd.Description,
            Value = prdv.Value
        });

クエリ構文:

var querySyntax = from pr in db.PersonRoles
     where pr.PersonID == 42
     let r = pr.Role
     from rd in r.RoleDetails
     from prdv in rd.PersonRoleDetailValues.DefaultIfEmpty()
     select new
     {
         Name = rd.Name,
         Description = rd.Description,
         Value = prdv.Value
     };

ありがとうございました

4

1 に答える 1

2

マッピングが正しく設定されていれば、タイプ間にナビゲーション プロパティが存在するはずです。これにより、結合された列を何度も指定しなくても、1 つの型に関するクエリを開始し、他の型を含めることができます。

from pr in dataContext.PersonRoles
where pr.PersonId = 42
  //navigation property Many->One  Queryable.Select
let r = pr.Role  
  //navigation property One->Many  Queryable.SelectMany
from rd in r.RoleDetails
  //navigation property One->Many, match null if none
from prdv = rd.PersonRoleDetailValues.DefaultIfEmpty()
select new
{
  Name = rd.Name,
  Description = rd.Description,
  Value = prdv.Value
}

楽しみのために、メソッドの構文を可能な限り簡潔にします。

dataContext.PersonRoles
  .Where(pr => pr.PersonId = 42)
  .SelectMany(pr => pr.Role.RoleDetails)
  .SelectMany(rd => rd.PersonRoleDetailValues.DefaultIfEmpty(),
    (rd, prdv) => new
  {
    Name = rd.Name,
    Description = rd.Description,
    Value = prdv.Value
  });
于 2013-07-24T01:56:16.483 に答える