使用 LINQ 筛选结果

本文关键字:结果 筛选 LINQ 使用 | 更新日期: 2023-09-27 18:17:16

我正在将 ADO.NET 应用程序转换为使用实体框架 5,但在重写搜索函数时遇到了问题。我已经分离了 UI 层和数据库层,数据库层现在有一个内部 edmx 并公开了数据检索方法。

一种这样的方法是搜索。由于该函数不再可以直接访问表单控件值(曾经有一个 LINQ 查询 UI 代码隐藏文件(,我创建了一个类来允许表单传递这些值

public class SearchParameter
{
    public string Name { get; set; }
    public bool Checked { get; set; }
    public object Value { get; set; }
}

我知道这会导致对值进行装箱,但我看不到任何其他允许多种值类型的方法

搜索功能如下所示

public static IList SearchRecords(IList<SearchParameter> searchParams)
{
   using (var db = new EarnieEntities())
   {
       var result = db.Non_Conformance;
       //Filter Results based on params
       foreach (var p in searchParams.Where(p => p.Checked))
       {
           switch (p.Name)
           {
               case "NCID":
                   break;
               case "DateRaised":
                   break;
               case "RaisedBy":
                   break;
               case "RaisedFor":
                   break;
           }
       }
       return result.ToList();
   }
}

对于上述每种情况,使用 LINQ to SQL,我本可以编写这样的东西来过滤该字段的结果集

result = result.Where(x => x.NC_ID == (int) p.Value).Select(x => x);

使用 LINQ to SQL 时的想法是利用延迟加载,并在访问结果之前允许所有筛选。这允许用户在 UI 上选择字段并构建其搜索条件。

使用 EF,我得到

不能将源类型 Linq.IQueryable<类型> 转换为目标类型 Data.Entity.DbSet<类型>

有没有另一种方法可以进行这种过滤?

[更新]

如果我尝试简单地将结果转换为 DbSet,则会出现另一个错误

无法强制转换类型为"系统.数据.实体.基础结构.数据库查询"1[EarnieDAL.Sources.Non_Conformance]' to type 'System.Data.Entity.DbSet 1[EarnieDAL.Sources.Non_Conformance]

的对象

使用 LINQ 筛选结果

您收到该错误的原因是您将"result"初始化为 DbSet,然后稍后尝试为其分配 IQueryable。

您可以使用result = db.Non_Conformance.AsQueryable()初始化结果