Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在没有冗余代码的情况下组合linq查询_C#_.net_Linq - Fatal编程技术网

C# 在没有冗余代码的情况下组合linq查询

C# 在没有冗余代码的情况下组合linq查询,c#,.net,linq,C#,.net,Linq,嘿,伙计们,提前谢谢你们的帮助。我是一名前端开发人员,但最近我一直在研究一些更完整的堆栈错误。我是C语言的新手,我想重构这个查询以减少冗余。如何将这两个linq查询组合成一个,以便只需要一个查询。每个语句而不是两个相同的语句?我尝试过类似var query1=xxx的方法,然后query2=query1.Where。。。但是我不能完全正确地理解语法。再次感谢 public interface ILoginLinkService { Dictionary<string, IList

嘿,伙计们,提前谢谢你们的帮助。我是一名前端开发人员,但最近我一直在研究一些更完整的堆栈错误。我是C语言的新手,我想重构这个查询以减少冗余。如何将这两个linq查询组合成一个,以便只需要一个查询。每个语句而不是两个相同的语句?我尝试过类似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;
    }        
}

我解决了@你好昨晚你的回答特别有用。无论如何谢谢你们,伙计们。。。 命名空间xxx.Business.Common.Services {


}

你不能只是粘贴大量代码,然后让其他人修复。搜索一些教程并开始工作。你甚至还没有展示你的每种方法。你为什么不用餐车呢?一般来说,这种方法违反了所有其他序列操作符所基于的函数编程原则。显然,调用此方法的唯一目的是造成副作用。表达式的目的是计算值,而不是产生副作用。声明的目的是产生副作用。请重新格式化您的问题,以显示数据、linq查询的最小可验证示例,以及您自己尝试如何将它们组合在一起,并且此问题将更进一步。我想知道您为什么要这样做?在我看来,查询中的拆分使代码具有可读性。当代码中出现错误时,组合查询将使阅读变得困难。我不知道如何组合它们,因为where包含不属于select的列上的逻辑。
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;
    }
}