嘿伙计们提前感谢任何帮助。我是一名前端开发人员,但最近我一直在处理一些更多的全栈错误。我对 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;
}
}
}