【问题标题】:LINQ method using Where, Contains and Foreach to update Entity.DbSet using a List<T>LINQ 方法使用 Where、Contains 和 Foreach 使用 List<T> 更新 Entity.DbSet
【发布时间】:2018-08-23 08:55:38
【问题描述】:

我使用Entity Framework来生成Database表类:

public partial class TPTM605
{
    public string EMP { get; set; }
    public string ATTD_DATE { get; set; }
    public string ATTD_TIME { get; set; }
    public string MAC_NO { get; set; }
    public Nullable<decimal> GPS_LATI { get; set; }
    public Nullable<decimal> GPS_LONG { get; set; }
    public string APRO_EMP { get; set; }
    public string APRO_DATE { get; set; }
    public string APRO_YN { get; set; }
    public string PROC_DATE { get; set; }
    public string ERR_CODE { get; set; }
    public string KN_DATE { get; set; }
}

然后我创建另一个类:

public class AproData
{
    // Employee ID
    public string emp { get; set; }

    // Attendance Date
    public string attd_date { get; set; }

    /// Attendance time
    public string attd_time { get; set; } 

    // Approve (Y/N)
    public string apro_yn { get; set; }
}

在TPTM605类中,其属性(EMP、ATTD_DATE、ATTD_TIME)为主键,属性(APRO_YN)的默认值为null。 然后我创建了一个WCF方法-SetAproMissCard(string apro_emp, string apro_date, List Data),输入参数(List Data)是一个领导批准Yes/No的最终结果的List。

我想使用 AproData(ID, date, time) 在 DbSet 中查找记录, 然后使用 AproData(apro_yn) 更新 TPTM605 的属性(APRO_YN)。

public bool SetAproMissCard(string apro_emp, string apro_date, List<AproData> Data)
{
    bool rst = false;
    try
    {
        using (OracleEmpAppModelEntities oEAME = new OracleEmpAppModelEntities())
        {
            foreach (var item in Data)
            {
                oEAME.TPTM605.Where(t => t.EMP.Equals(item.emp) && t.ATTD_DATE.Equals(item.attd_date) && t.ATTD_TIME.Equals(item.attd_time))
                        .ToList().ForEach(t => { t.APRO_EMP = apro_emp; t.APRO_DATE = apro_date; t.APRO_YN = item.apro_yn; });
            }
            oEAME.SaveChanges();
        }
        rst = true;
    }

它工作正常。但是 C# foreach-loop 语法看起来不够聪明。

我想使用 LINQ 扩展方法(.Where、.Contains、.ForEach() 等)和 Lambda 来改进它,而不是使用 C#“foreach”语法。谁能教我如何实现它?非常感谢。

附言抱歉,我的英语很差。希望你能理解我的问题。

【问题讨论】:

  • 嗨@Leo。如果你有例外,为什么不在这里发布呢?
  • 嗨@Boris,例外是“无法构建'WcfServiceCsbcEmpApp.Models.AproData'。上下文仅支持基本类型或IEnumerable类型。”。对不起,那个异常信息是繁体中文。我试着翻译一下。谢谢。
  • 试着把它变成一个对象:public bool SetAproMissCard(string apro_emp, string apro_date, object Data)
  • 嗨,@jdweng,实际上,我想找到一组 LINQ 方法(例如 Where、Contains、ForEach 等),而不是最初使用 C# foreach -loop。谢谢。
  • 我知道这很挑剔,但ForEach 不是 Linq。这是List&lt;T&gt;的正常方法。 Linq 中的 Q 代表 queryForEach 用于采取行动,而不是查询。

标签: c# linq lambda


【解决方案1】:

尝试以下:

var results = (from item in Data
               join t in oEAME.TPTM605 on  item.emp  equals t.EMP
               where t.ATTD_DATE.Equals(item.attd_date) && t.ATTD_TIME.Equals(item.attd_time)
               select new { APRO_EMP = apro_emp, APRO_DATE = apro_date, APRO_YN = item.apro_yn }).ToList();

【讨论】:

  • 嗨,@jdweng,你能把你的代码转换成 LINQ Method Lambda 吗?原谅我这么挑剔。微软建议程序员使用LINQ方法比LINQ更好,我也更喜欢使用Lambda(我觉得它是一种编程设计的艺术。哈..)
  • 我只用这种方式加入。我使用 Linq 的所有其他东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2012-09-21
  • 2011-10-22
相关资源
最近更新 更多