[Linq] Linq如何调用外部方法?

本文探讨了如何在LINQ查询中直接调用自定义方法,如IsContact、GetBudgetNoList等,以及遇到的问题与解决策略,包括使用匿名类型和强类型实体。通过实例演示了EFCORE中函数映射和避免返回结果不变的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厦门德仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值