【发布时间】: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 包含不属于选择的列上的逻辑。