Linq如何调用外部方法?
通常我们会有这样的需求,以前写SQL会直接在自定义函数,在EF非FECORE中处理比较麻烦。那么LINQ 能否在返回匿名实体的时直接调用外部方法呢?编译通过,运行时报错!
思考为何不行呢?假设方法a()
var xxxs= from…;
select new {
b=a();
}
其本质应该还是返回IQueryable或IEnumerable接口。编译输出xxxs.tolist()
发现是空值
思路一:匿名类型无法实现构造新列并赋值,那是否可以新建一个强类型实体并预算计算列。
遍历赋值;
foreach (var item in fAContractNews)
{
item.IsAttachment = IsAttachment(item.ID);
item.IsContact = IsContact(item.ID);
item.BudgetNoList = GetBudgetNoList(item.ID);
}
/// <summary>
/// 是否关联
/// </summary>
/// <param name="ID"></param>
/// <returns></returns>
private string IsContact(Guid ID)
{
var detail = context.FAContractDetail.Where(t => t.FACID == ID);
var i = detail.ToList().Count;
return i > 0 ? "已录入[" + i.ToString() + "]台设备" : "未录入设备";
//return "未关联任何设备";
}
private string GetBudgetNoList(Guid ID)
{
string[] budgetNos = context.FAContractDetail.Where(t => t.FACID == ID).Select(a => a.BudgetNo).Distinct().ToArray(); //获取员工编号数组
string str = string.Join(",", budgetNos);
return str;
}
/// <summary>
/// 是否有附件
/// </summary>
/// <param name="ID"></param>
/// <returns></returns>
private string IsAttachment(Guid ID)
{
return context.MesAttachment.Any(t => t.FileId == ID) == true ? "有" : "无"; ;
}
输出仍然是空值,问题出自哪里?
还是之前同样的问题返回的结果,并不会被修改。
所以构建一个list对象存储之后,再遍历;
思路二 不构建强类型实体,tolist().select()处理呢?
既然是转成tolist()之后可以,那是否可以tolist之后.select 时调用呢?
LINQ
(from pt in db.oaProjectTasks
where pt.ProjectID == ProjectID
join t in db.oaTasks on pt.TaskID equals t.TaskID
where t.ParentTaskID == null
let daypassed = GetDaysPassed(t.StartDate,t.Duration)
select new ChartTask{TaskNumber = t.TaskNumber,StartDate = t.StartDate,
DurationRemaining = t.Duration - daypassed,TaskDescription = t.Task, DaysPassed = daypassed,Duration = t.Duration }).ToList();
自定义方法
private int GetDaysPassed(DateTime StartDate, int Duration)
{
int retVal;
if ((DateTime.Now - StartDate).Days > 0)
{
if ((DateTime.Now - StartDate.AddDays(Duration)).Days > 0)
{
retVal = Duration;
}
else
{
retVal = (DateTime.Now - StartDate).Days;
}
}
else
{
retVal = 0;
}
return retVal;
}
TOLIS()后Select() Goesto 返回
(from pt in db.oaProjectTasks
where pt.ProjectID == ProjectID
join t in db.oaTasks on pt.TaskID equals t.TaskID
where t.ParentTaskID == null
select t)
.ToList() // T-SQL query will be executed here and result will be returned
.Select(t => new ChartTask {
TaskNumber = t.TaskNumber,
StartDate = t.StartDate,
DurationRemaining = t.Duration - GetDaysPassed(t.StartDate,t.Duration),
TaskDescription = t.Task,
DaysPassed = GetDaysPassed(t.StartDate,t.Duration),
Duration = t.Duration });
因为时间关系方案二并未实际测试,理论上是可以的。
测试效果
EFCORE 调用函数:
https://docs.microsoft.com/zh-cn/ef/core/querying/user-defined-function-mapping