2017-08-08 36 views
-4

我试图把我的lambda字符串与+标志放在一起,它不会让我运行代码,因为它说无效表达式!Lambda concatenation

顶端Code

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 = ""; 
} 

查询

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) 
      +ApprovalFilterBuild+ 
      .Where(i => i.RIM_Resource.LAN == i.RIM_Resource.LAN) 
      .Where(i => LANlist.Contains(i.RIM_Resource.LAN)); 


return View(await certificationContext.ToListAsync()); 
+9

既然你什么时候可以Concat的实际代码简单的字符串? –

+1

您试图将'Expression'与'string'连接起来,但不能。 – tchelidze

+0

那么你会如何做到这一点?我只是一名实习生。 –

回答

1

批准过滤器需要是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; 
} 

这就是你如何在主查询中使用它。

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)); 

如果批准,可没有3个检查,然后考虑将默认值i => true

5

所有这些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); 
} 
+0

评论是不适合扩展讨论;这个对话已经[转移到聊天](http://chat.stackoverflow.com/rooms/151406/discussion-on-answer-by-davidg-lambda-concatenation)。 –

-2

要确保它与两个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)); 

的“结果”变量将有你想要的结果。

+0

对于这些操作,您不应该使用'AsEnumerable',因为您希望它们在数据库上执行,而不是在内存中执行。如果你想避免明确输入变量,你可以使用'AsQueryable'。 – Servy

+0

它不会因为我的回报而工作 –