组合 LINQ 查询而不使用冗余代码



嘿伙计们提前感谢任何帮助。我是一名前端开发人员,但最近我一直在处理一些更多的全栈错误。我对 C# 很陌生,我想重构此查询以减少冗余。如何将这两个 linq 查询合并为 1,以便我只需要 1 个查询。每个陈述而不是两个相同的陈述?我尝试过类似 var query1 = xxx 然后 query2 = query1 的东西。哪里。。。但我无法完全正确理解语法。再次感谢。

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;
    }        
}

我解决了。 @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;
    }
}

}

最新更新