【问题标题】:Filter Results with LINQ使用 LINQ 过滤结果
【发布时间】:2013-06-07 07:36:56
【问题描述】:

我正在转换 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 转换为目标类型 Data.Entity.DbSet

还有其他方法可以进行这种过滤吗?

[更新]

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

无法投射“System.Data.Entity.Infrastructure.DbQuery1[EarnieDAL.Sources.Non_Conformance]' to type 'System.Data.Entity.DbSet1[EarnieDAL.Sources.Non_Conformance]”类型的对象

【问题讨论】:

  • 不幸的是我现在不能检查它,但是如果你替换 'var result = db.Non_Conformance;' with var 'result = db.Non_Conformance.Select(x=>x);'
  • facepalm 现在会尝试,但我认为就是这样
  • 非常感谢 Uriil,当机立断。

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


【解决方案1】:

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

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

【讨论】:

  • 我还不能将 cmets 添加到您的问题中,但 Uriil 是正确的。这与我在答案的第一部分中给出的结果相同,但我认为 AsQueryable() 可能是一个更好的解决方案?
  • +1 表示第一部分。第二种选择不起作用,因为开关在 foreach 循环内(它需要逐渐将 IQueryables 链接在一起,因此每次迭代都不能从一个新的开始)。
  • 第二个选项将通过具体化到一个列表来绕过延迟加载。这将导致我撤回所有内容然后过滤。第一个选项是现场。
  • 啊,是的,乍一看并没有看到。然后坚持选项 1 ;p
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 2014-10-23
  • 2011-10-24
相关资源
最近更新 更多