如何在asp.net核心的for循环中使用linqkit

Posted

技术标签:

【中文标题】如何在asp.net核心的for循环中使用linqkit【英文标题】:how to use linqkit within for loop in asp.net core 【发布时间】:2020-05-19 14:16:09 【问题描述】:

我的代码在数组长度==1 时有效。 当我的数组长度大于 1 时,我得到错误的列表数据。

    var classtime = PredicateBuilder.True<ServiceManual>();
            for (int i = 0; i < Category.Length; i++)
            
                long? cateID = Convert.ToInt64(Category[i]);
                if (Category.Length == 1)
                
                    classtime = classtime.And(i => i.CategoryID == cateID);
                
                else
                
                    classtime = classtime.Or(i => i.CategoryID == cateID);
                
            
var lstclasssCate = context.tblServiceManual.Where(classtime.Compile()).ToList();

【问题讨论】:

您是否知道在 Category.Length==1 和 Category.Length !=1 时添加了相同的 And 子句 是的,但我使用的是课堂时间。或者,我也得到了错误的列表数据。我更新代码 只是一个提示,当您重用相同的变量名时,阅读代码会更加困难,请考虑更改 classtime.And(i =&gt; i.CategoryID == cateID): 以使用其他变量名而不是迭代变量,例如classtime.And(ct =&gt; ct.CategoryID == cateID); 错误列表数据是什么意思?您是否尝试过调试代码以确保 classTime.compile 的结果包含预期的条件? 意味着我正在获取所有列表数据而不是这些 ID 数据。 【参考方案1】:

你的逻辑是错误的,代码无法编译(在循环中引用 i 已经在使用 i),而且你这样做很困难。

就这样称呼吧:

var cats = Category.Select(c=>Convert.ToInt64(c)).ToArray();
var lstclasssCate = context.tblServiceManual
  .Where(t=>cats.Contains(t.CategoryID))
  .ToList();

艰难的道路:

var classtime = PredicateBuilder.False<ServiceManual>();
foreach(var catId in Category.Select(c=>Convert.ToInt64(c)))

  classtime = classtime.Or(i => i.CategoryID == catId);

var lstclasssCate=context.tblServiceManual
  .Where(classtime.Compile())
  .ToList();

【讨论】:

【参考方案2】:

我用过asp.net core 2.2和LinqKit 1.1.7,可以显示所有列表数据。

1.型号:

public class ServiceManual

    public int Id  get; set; 
    public string Name  get; set; 

2.Controller(你不能在linq中使用i):

public class ServiceManualsController : Controller

    private readonly MVC2Context _context;

    public ServiceManualsController(MVC2Context context)
    
        _context = context;
    

        // GET: ServiceManuals
    public List<ServiceManual> Index()
    
        var Category = new int[]  1,2,3;
        var classtime = PredicateBuilder.True<ServiceManual>();
        for (int i = 0; i < Category.Length; i++)
        
            long? cateID = Convert.ToInt64(Category[i]);
            if (Category.Length == 1)
            
                classtime = classtime.And(c => c.Id == cateID);
            
            else
            
                classtime = classtime.Or(c => c.Id == cateID);
            
        
        var lstclasssCate = _context.tblServiceManual.Where(classtime.Compile()).ToList();
        return lstclasssCate;
    

3.结果:

【讨论】:

以上是关于如何在asp.net核心的for循环中使用linqkit的主要内容,如果未能解决你的问题,请参考以下文章

请问ckfinder for asp.net的图片名中文变乱码如何解决??

asp.net mvc中使用linq to sql查询数据集(IQueryable类型) 怎么用foreach循环去数据集的数据?

ASP.NET EF 使用LinqPad 快速学习Linq

在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图

asp.net mvc3 linq 多表查询怎么把返回的集合在页面循环输出

如何使用 LINQ 在 asp.net mvc 中获取具有特定子值的所有父母? [复制]