【问题标题】:From Sql to Linq-toSql从 Sql 到 Linq-toSql
【发布时间】:2013-07-24 01:19:06
【问题描述】:

我正在使用 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
     };

谢谢

【问题讨论】:

  • 你有没有想过下载 Linqer 或 LinqPad??
  • @DJKRAZE,不,我没有,谢谢。 Linqer 成本,但我会试试 LinqPad。
  • 为什么这个问题被否决了?很高兴听到有理由的评论,这样我就可以改进。
  • 这是一个很好的问题,我给了你一个 UpVote

标签: c# .net sql linq linq-to-sql


【解决方案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
  });

【讨论】:

  • 感谢您的帮助。非常感谢并帮助我理解了使用 Linq。您的解决方案需要稍作修改才能工作,这就是我在帖子中添加解决方案的原因,但您会得到最佳答案;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多