C# Lambda级联
我尝试将lambda字符串放入+符号中,但它不允许我运行代码,因为它表示无效表达式 代码顶端C# Lambda级联,c#,sql,lambda,asp.net-core,C#,Sql,Lambda,Asp.net Core,我尝试将lambda字符串放入+符号中,但它不允许我运行代码,因为它表示无效表达式 代码顶端 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkC
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using Certifications.Data;
using Certifications.Models;
using Microsoft.EntityFrameworkCore.Internal;
namespace Certifications.Controllers
{
public class Managerial : Controller
{
private readonly CertificationContext _context;
public Managerial(CertificationContext context)
{
_context = context;
}
滤器
// Approval Filter
string ApprovalFilterBuild = "";
if (approval == "Approved")
{
ApprovalFilterBuild = ".Where(i => i.Approved == true);";
}
if (approval == "Revoked")
{
ApprovalFilterBuild = ".Where(i => i.Approved == false);";
}
if (approval == "ALL")
{
ApprovalFilterBuild = "";
}
质疑
所有这些Linq方法都返回IQueryable,在您迭代结果之前,它不会对您的数据库执行。因此,您可以简单地执行以下操作:
//Assuming the type name is INT_CertificationsXREF:
IQueryable<INT_CertificationsXREF> certificationContext = _context.INT_CertificationsXREF
.Include(i => i.INT_CertificationCategories)
.Include(i => i.INT_Certifications)
.Include(i => i.INT_CertificationConferred)
.Include(i => i.RIM_Resource);
if (approval == "Approved")
{
certificationContext = certificationContext.Where(i => i.Approved == true);
}
else if (approval == "Revoked")
{
certificationContext = certificationContext.Where(i => i.Approved == false);
}
为了确保它同时适用于IEnumerable和IQueryable,您可以使用以下代码:
var certificationContext = _context.INT_CertificationsXREF
.Include(i => i.INT_CertificationCategories)
.Include(i => i.INT_Certifications)
.Include(i => i.INT_CertificationConferred)
.Include(i => i.RIM_Resource).AsEnumerable();
if (approval == "Approved")
{
certificationContext = certificationContext.Where(i => i.Approved).AsEnumerable();
}
if (approval == "Revoked")
{
certificationContext = certificationContext.Where(i => !i.Approved).AsEnumerable();
}
var result = certificationContext.Where(i => i.RIM_Resource.LAN == i.RIM_Resource.LAN).Where(i => LANlist.Contains(i.RIM_Resource.LAN));
结果变量将具有所需的结果。批准筛选器需要是lambda表达式,而不是字符串。这就是您构建它的方式
// Approval Filter
Expression<Func<INT_CertificationsXREF, bool>> ApprovalFilterBuild;
if (approval == "Approved")
{
ApprovalFilterBuild = i => i.Approved == true;
}
if (approval == "Revoked")
{
ApprovalFilterBuild = i => i.Approved == false;
}
if (approval == "ALL")
{
ApprovalFilterBuild = i => true;
}
如果批准可以不是3个检查中的任何一个,那么考虑将默认值分配给I==Trase
,因为何时可以用实际代码来勾结简单字符串?您试图用字符串连接表达式,不能。那么,您将如何处理?我只是一名实习生。请参阅张贴的答案。这就是你想要处理它的方式。如果您绝对需要使用字符串,即,您正在从外部源读取数据,您可以使用反射来完成此操作。风格诡辩:您不应该显式地比较true和false。您不应该对这些操作使用AsEnumerable,因为您希望它们在DB上执行,而不是在内存中执行。如果希望避免显式键入变量,可以使用AsQueryable;这段对话已经结束。// Approval Filter
Expression<Func<INT_CertificationsXREF, bool>> ApprovalFilterBuild;
if (approval == "Approved")
{
ApprovalFilterBuild = i => i.Approved == true;
}
if (approval == "Revoked")
{
ApprovalFilterBuild = i => i.Approved == false;
}
if (approval == "ALL")
{
ApprovalFilterBuild = i => true;
}
var certificationContext = _context.INT_CertificationsXREF
.Include(i => i.INT_CertificationCategories)
.Include(i => i.INT_Certifications)
.Include(i => i.INT_CertificationConferred)
.Include(i => i.RIM_Resource)
.Where(ApprovalFilterBuild)
.Where(i => i.RIM_Resource.LAN == i.RIM_Resource.LAN)
.Where(i => LANlist.Contains(i.RIM_Resource.LAN));