使用LINQ过滤结果

时间:2013-06-07 07:36:57

标签: c# linq entity-framework entity-framework-5

我正在转换ADO.NET应用程序以使用Entity Framework 5,并在重写搜索功能时遇到了一个问题。我已经分离了UI和DB层,DB层现在有一个内部edmx并公开了数据检索方法。

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

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&lt;输入&gt;目标类型Data.Entity.DbSet&lt;输入&gt;

还有其他方法可以进行此类过滤吗?

[更新]

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

  

无法转换类型为'System.Data.Entity.Infrastructure.DbQuery 1[EarnieDAL.Sources.Non_Conformance]' to type 'System.Data.Entity.DbSet的对象1 [EarnieDAL.Sources.Non_Conformance]

1 个答案:

答案 0 :(得分:3)

您收到该错误的原因是您初始化了&#34;结果&#34;作为DbSet,然后尝试稍后为其分配IQueryable。

您可以使用result = db.Non_Conformance.AsQueryable()

初始化结果