首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将复杂的T查询转换为LINQ到实体

将复杂的T查询转换为LINQ到实体
EN

Stack Overflow用户
提问于 2016-01-21 18:52:41
回答 1查看 57关注 0票数 0

这是生成正确结果的SQL代码:

代码语言:javascript
复制
select s.Code, s.Name, coalesce(ss.Url,  a.Url), a.SocialMediaTypeKey
from School s
Left join 
(
SELECT dbo.SchoolSocialMedia.SocialMediaTypeKey
, SchoolSocialMedia.Url
, dbo.Department.Name
, dbo.Department.ImportBusinessKey
FROM dbo.SchoolSocialMedia 
    INNER JOIN dbo.Department ON dbo.SchoolSocialMedia.DepartmentId =   dbo.Department.Id
) A 
ON 1 = 1
Left join dbo.SchoolSocialMedia ss ON ss.SchoolId = s.Id and    ss.SocialMediaTypeKey = a.SocialMediaTypeKey
where  s.[DeactivatedDate] is null

这就是我在C#中所取得的成绩,但它并没有产生正确的结果--事实上,它返回的结果为零:

代码语言:javascript
复制
        var departmentSocialMediaResult =
            from ssm in context.SchoolSocialMedia
            from d in context.Department.Where(d => d.Id == ssm.DepartmentId)
            select new { ssm.SocialMediaTypeKey,
                ssm.Url,
                d.Name,
                ssm.SchoolId };
        var result =
            (from s in context.School
             from ssm in context.SchoolSocialMedia.DefaultIfEmpty()
             from dssm in departmentSocialMediaResult.DefaultIfEmpty()
             .Where(dssm => dssm.SchoolId == s.Id && dssm.SocialMediaTypeKey == ssm.SocialMediaTypeKey)
             select new { ssm.SchoolId, ssm.SocialMediaTypeKey, ssm.Url })
             .ToDictionary(ssm => new SchoolSocialMediaKey(
                    ssm.SchoolId, ssm.SocialMediaTypeKey),
                ssm => ssm.Url);

有没有人对如何更好地将T转换为LINQ到实体有任何建议?我做错了什么?蒂娅。

更新:

“谢谢,”阿杜西,你的回答是正确的。由于结果正在被放入字典中,所以我最终使用的是:

代码语言:javascript
复制
        var query =
            (from s in context.School
            from a in
            (
               from ssm in context.SchoolSocialMedia
               join d in context.Department on ssm.DepartmentId equals d.Id
               select new
               {
                   ssm.SocialMediaTypeKey,
                   ssm.Url,
                   d.Name
               }
            ).DefaultIfEmpty()
            from ss in context.SchoolSocialMedia
                              .Where(x => s.Id == x.SchoolId)
                              .Where(x => a.SocialMediaTypeKey == x.SocialMediaTypeKey)
                              .DefaultIfEmpty()
            select new
            {
                ss.SchoolId,
                Url = ss.Url ?? a.Url,
                a.SocialMediaTypeKey
            }).Distinct();

        return
            query
            .ToDictionary(
                ssm => new SchoolSocialMediaKey(
                    ssm.SchoolId, ssm.SocialMediaTypeKey),
                ssm => ssm.Url);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-21 19:16:06

我确信有一种更好的方法来编写原始查询,但我没有花太多时间进行分析,而是将其翻译成linq。通常,linq查询应该具有与tsql查询相同的结构,如下所示:

代码语言:javascript
复制
var query =
   from s in context.School
   from a in
   (
      from ssm in context.SchoolSocialMedia
      join d in context.Department on ssm.DepartmentId equals d.Id
      select new
      {
         ssm.SocialMediaTypeKey,
         ssm.Url,
         d.Name,
         d.ImportBusinessKey
      }
   ).DefaultIfEmpty()
   from ss in context.SchoolSocialMedia
                     .Where(x => s.Id == x.SchoolId)
                     .Where(x => a.SocialMediaTypeKey  == x.SocialMediaTypeKey)
                     .DefaultIfEmpty()
   select new
   {
       s.Code, 
       s.Name, 
       Url = ss.Url ?? a.Url, 
       a.SocialMediaTypeKey
   }; 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34931999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档