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