查询实体框架4,查询问题的方法

时间:2011-05-06 01:45:53

标签: c# entity-framework-4 querying

我有一点误会,我希望你能为我清楚。 我有一个名为:请求的表。

我想做查询,让我们说请求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. 之外,我如何使用多行结果
  4. 我需要构建和高级搜索(我有6-7列),有没有一种常用的方法呢?
  5. 谢谢!!

2 个答案:

答案 0 :(得分: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然后你还没有真正从数据库中检索结果,你刚刚定义了你的查询,这会导致消费者检索结果时出现问题,因为只有数据库查询是已执行 - 但相应的DB上下文可能已经处理完毕。在查询末尾附加.ToList()以实现IQuerable<T>

  

我需要构建和高级搜索(我有6-7列),有没有   常见的方法吗?

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

答案 1 :(得分:1)

你的问题是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();
}