【问题标题】:How do I convert SQL Query to Lambda?如何将 SQL 查询转换为 Lambda?
【发布时间】:2019-07-11 08:10:53
【问题描述】:

我有以下 SQL 查询返回我需要的结果:

SELECT 
       STAFF_ID
FROM [dbo].[StaffTable]
WHERE STAFF_ID NOT IN (SELECT STAFF_ID 
                                     FROM [dbo].[StaffingTable]
                                     WHERE [DATE] = @DATE
                                     AND MODEL_ID = @Model)

我有以下控制器方法来尝试返回正确的结果:

public JsonResult GetStaffResults(DateTime date, string modelId)
        {
            Guid modelGuid = Guid.Parse(modelId);
            var settings = new JsonSerializerSettings();

            var staff = context.StaffTable.Select(c => new
            {
                Id = c.StaffId,
                Name = c.StaffName
            });

            var staffing = context.StaffingTable.Select(c => new
            {
                modelId = c.ModelId,
                manufacturerId = c.ManufacturerId,
                staffId = c.StaffId,
                date = c.Date,
                recordId = c.RecordId
            });

            var staffResults = staff.Where(p => staffing.Select(o => o.modelId).First() == modelGuid && !staffing.Select(o => o.date).Contains(date));

            return Json(shiftResults, settings);
        }

但是,我在 Lambda 表达式上苦苦挣扎,它没有返回任何结果,所以我在某处遗漏了一些东西。

【问题讨论】:

  • SQL 语句中不需要那个DISTINCT,它只是增加了一个延迟和一个不必要的排序。
  • 很公平。我会删除它,谢谢。
  • 附带说明,避免直接在控制器(或任何最终的“响应发送者”)中调用数据库上下文。考虑构建一个独立执行调用并让控制器使用结果的类。

标签: c# sql asp.net asp.net-mvc


【解决方案1】:

你可以试试这样的:

 public JsonResult GetStaffResults(DateTime date, string modelId)
        {
            Guid modelGuid = Guid.Parse(modelId);
            var settings = new JsonSerializerSettings();

            var staffQuery = context.StaffTable
                .Where(s => !context
                    .StaffingTable
                    .Any(st => st.StaffId = s.StaffId && st.modelId == modelGuid && st.date == date))
                .Select(c => new
                {
                    Id = c.StaffId,
                    Name = c.StaffName
                });

            return Json(staffQuery.ToList(), settings);
        }

【讨论】:

  • 太棒了,谢谢。这突显出我需要在这些表达上做得更好!
【解决方案2】:

您正在使用 Select 进行单独查询,这存在性能问题,因为查询将返回 IEnumerable<T> 对象。如果您想进行单独的查询,请尝试以IQueryable<T> 获取查询结果,这将构造查询并在最后加载数据。

例如:

var query =    
    from st in context.StaffTable  
    where !(from stff in context.StaffingTable  
            select stff.CustomerID)
            where stff.MODEL_ID = ModelIdVariable AND stff.DATE = DATEVariable
           .Contains(st.CustomerID)    
    select st;

在查询之前声明并填充ModelIdVariableDATEVariable 变量。

然后你可以在需要加载数据的地方做query.ToList<T>()

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2021-05-30
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多