【问题标题】:combining linq queries without redundant code组合 linq 查询而无需冗余代码
【发布时间】:2017-03-20 12:46:27
【问题描述】:

大家好,提前感谢您的帮助。我是一名前端开发人员,但最近我一直在研究一些更全栈的错误。我对 C# 很陌生,我想重构这个查询以减少冗余。如何将这两个 linq 查询合并为 1 个,以便我只需要 1 个查询。每个语句而不是两个相同的语句?我尝试过类似 var query1 = xxx 然后 query2 = query1.Where... 但我无法完全正确地使用语法。再次感谢。

public interface ILoginLinkService 
{
    Dictionary<string, IList<NameValuePair>> GetLoginPageLinks();
}

public class LoginLinkService : ILoginLinkService
{
    private readonly IUnitOfWork unitOfWork;

    public LoginLinkService(IUnitOfWork unitofwork)
    {
        this.unitOfWork = unitofwork;
    }

    public Dictionary<string, IList<NameValuePair>> GetLoginPageLinks()
    {
        var data = new Dictionary<string, IList<NameValuePair>>();

        var query = (from s in unitOfWork.Repository<LoginPageLink>().Queryable()
                     orderby s.LoginPageLinkCategory.Code, s.SortOrder
                         select new 
                         {
                             s.LoginPageLinkCategory.Code,
                             s.Name,
                             s.Url,
                         });
        query.Each(x =>
        {
            var pair = new NameValuePair() {Name = x.Name, Value = x.Url,};
            IList<NameValuePair> list;
            if (data.ContainsKey(x.Code))
            {
                list = data[x.Code];
            }
            else
            {
                list = new List<NameValuePair>();
                data[x.Code] = list;
            }
            list.Add(pair);
        });

        var announcementsQuery = (from s in unitOfWork.Repository<LoginPageLink>().Queryable()
                                  .Where(x => x.LoginPageLinkCategory.Code == LoginPageLinkCategory.AnnouncementsCode &&
                                   (DbFunctions.DiffDays(x.CreatedDate, DateTimeOffset.Now) ?? 0) <= 7)
                                  select new
                                  {
                                      s.LoginPageLinkCategory.Code,
                                      s.Name,
                                      s.Url,
                                  });
        announcementsQuery.Each(x =>
        {
            var pair = new NameValuePair() { Name = x.Name, Value = x.Url, };
            IList<NameValuePair> list;
            if (data.ContainsKey(x.Code))
            {
                list = data[x.Code];
            }
            else
            {
                list = new List<NameValuePair>();
                data[x.Code] = list;
            }
            list.Add(pair);
        });

        return data;
    }        
}

【问题讨论】:

  • 您不能只是粘贴大量代码并要求其他人修复它。谷歌一些教程并开始工作。
  • 你甚至没有显示你的Each-方法。为什么不使用foreach?一般来说,这种方法“违反了所有其他序列运算符所基于的函数式编程原则。显然,调用此方法的唯一目的是产生副作用。表达式的目的是计算一个值,而不是引起副作用。声明的目的是引起副作用" (“foreach” vs “ForEach”)
  • 请重新格式化您的问题,以显示最低限度的、可验证的数据示例、linq 查询以及您自己尝试将它们组合起来的操作,这个问题会更进一步。跨度>
  • 我想知道你为什么要这样做?在我看来,查询的拆分使代码可读。组合查询会让人难以阅读(只要代码中有错误。
  • 我看不出如何组合它们,因为 where 包含不属于选择的列上的逻辑。

标签: c# .net linq


【解决方案1】:

我解决了。 @hellogoodnight 你的回答特别有帮助。无论如何,谢谢你们......
命名空间 xxx.Business.Common.Services {

public interface ILoginLinkService
{

    Dictionary<string, IList<NameValuePair>> GetLoginPageLinks();

}

public class LoginLinkService : ILoginLinkService
{
    private readonly IUnitOfWork unitOfWork;

    public LoginLinkService(IUnitOfWork unitofwork)
    {
        this.unitOfWork = unitofwork;
    }

    public Dictionary<string, IList<NameValuePair>> GetLoginPageLinks()
    {
        var data = new Dictionary<string, IList<NameValuePair>>();

        var baseQuery = unitOfWork.Repository<LoginPageLink>().Queryable();

        var nonAnnouncementsQuery = baseQuery
            .Where(x => x.LoginPageLinkCategory.Code != LoginPageLinkCategory.AnnouncementsCode)
            .Select(x => new
            {
                x.LoginPageLinkCategory.Code,
                x.Name,
                x.Url,
                x.SortOrder
            });

        var announcementsQuery = baseQuery
            .Where(x => x.LoginPageLinkCategory.Code == LoginPageLinkCategory.AnnouncementsCode &&
                (DbFunctions.DiffDays(x.CreatedDate, DateTimeOffset.Now) ?? 0) <= 7)
            .Select(x => new
            {
                x.LoginPageLinkCategory.Code,
                x.Name,
                x.Url,
                x.SortOrder
            });

        var fullQuery = nonAnnouncementsQuery.Union(announcementsQuery)
            .OrderBy(x => new { x.Code, x.SortOrder })
            .Select(x => new
            {
                x.Code,
                x.Name,
                x.Url
            });

        fullQuery.Each(x =>
        {
            var pair = new NameValuePair() { Name = x.Name, Value = x.Url, };
            IList<NameValuePair> list;
            if (data.ContainsKey(x.Code))
            {
                list = data[x.Code];
            }
            else
            {
                list = new List<NameValuePair>();
                data[x.Code] = list;
            }
            list.Add(pair);
        });

        return data;
    }
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多