【问题标题】:Querying in Entity Framework 4, method querying problemEntity Framework 4中的查询,方法查询问题
【发布时间】:2011-08-19 20:17:54
【问题描述】:

我有一点误解,我希望你能帮我弄清楚。 我有一个名为:Requests 的表。

我想查询,可以通过请求 ID 说,但它不起作用。

public Requests SearchById(int id)
{
    Model.ModelContainer cont = new Model.ModelContainer();
    return (cont.Requests.Where(req => req.ReqId == id));
    //when i try to cast to Request i get an error too
}

我找到了这个行应该工作的例子:

cont.Requests.First(req => req.ReqId == id)

但我在编译过程中遇到错误,它不能包含 lambda 表达式。

我有几个问题:

  1. 我如何处理上面的例子?(从实体查询)
  2. 除了转换为列表之外,我如何处理多行结果
  3. 我需要构建和高级搜索(我有 6-7 列),有没有常见的方法?

谢谢!!

【问题讨论】:

    标签: c# entity-framework-4 querying


    【解决方案1】:

    这应该可行:

    public Request SearchById(int id)
            {
               using(Model.ModelContainer cont = new Model.ModelContainer())
               {
                    return cont.Requests.Where(req => req.ReqId == id).FirstOrDefault();
               }
            }
    

    你得到的是一个IEnumerable<Request>,而不是一个请求。还要确保你有一个

    using System.Linq;
    

    在您的代码文件中。当您可以使用 using 块时,请始终处理上下文。

    cont.Requests.First(req => req.ReqId == id)
    

    这也应该有效 - 确保您的代码文件中有 using System.Linq

    除了转换为列表之外,我如何处理多行结果

    由于您的上下文是本地的,并且在您的方法之外不可用(它会在之后被处理),因此列表是您的最佳选择。如果您将其保留为IQueryable,那么您还没有真正从数据库中检索结果,您刚刚定义了查询,这会在消费者检索结果时导致问题,因为只有在执行数据库查询时 -但相应的数据库上下文可能已经被释放。在查询末尾附加.ToList() 以实现IQuerable<T>

    我需要构建和高级搜索(我有 6-7 列),是否有 常见的做法?

    您可以在 .Where() 扩展方法中组合多个子句,即Where( x=> x.A=="foo" && x.B == 42)。如有必要,您还可以链接多个 Where() 方法。

    【讨论】:

    • 使用 using 声明模型容器有什么区别
    • using 块是最佳实践,但这不是必需的。虽然应该鼓励 OP 使用它,但我认为将它放在这个答案中会使问题变得混乱。
    • @RonenIL:上下文所代表的资源被放置在using块的末尾。否则它们只会在 GC 最终到达时释放。
    • @RonenIL:添加了一些示例
    【解决方案2】:

    您的问题是 Where 返回一个对象集合(从零到多个)。您只需要一个对象。您不能简单地将对象集合转换为单个对象。

    相反,您应该获得First(或者如果您知道肯定只有一个,您可以致电Single)。

    关于 2 - 这取决于您想要做什么。您可以对结果集执行foreach,或者在将结果集放入列表之前从结果集中进行选择 - 但有时最有效的选择是先放入列表。

    第 3 点,有很多可用的模式。同样,这取决于您在做什么以及“搜索词”的工作方式。例如,

    public List<Requests> SearchById(int? id, DateTime? date, string name)
    {
        var cont = new Model.ModelContainer();
        var query = cont.Requests;
    
        if (id != null)
            query = query.Where(req => req.ReqId == id.Value);
    
        if (date != null)
            query = query.Where(req => req.Date == date.Value);
    
        if (!String.IsNullOrEmpty(name))
            query = query.Where(req => req.Name == name);
    
        return query.ToList();
    }
    

    【讨论】:

    • 非常感谢您的评论,您能给我一个处理对象集合的参考吗,或者给我一个简单的例子来获取 BLL 中的数据。
    • 这是一个对象的集合,我不知道BLL是什么
    • i ment 如果你能给我一个参考如何使用 Where 结果类型,即使是一个小例子。业务逻辑层(3 层设计)。
    • @RonenIL - 您正在使用 LINQ,我推荐 hookedonlinq.com/">Hooked On LINQ 作为资源。如果您有具体问题,请随时提出,但除非我知道您面临什么类型的问题,否则我无法真正提供指导。
    • 嗨,再次,有没有一种方法可以处理没有异常的结果?对于这个查询,我得到 InvaildOperationException : cont.Requests.First(req => req.ReqId == id) id 不存在
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多