繁体   English   中英

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

[英]Querying in Entity Framework 4, method querying problem

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

我想做查询,让我们说请求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列),有没有一种常见的方法来做到这一点?

谢谢 !!

这应该工作:

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=> xA=="foo" && xB == 42) 如有必要,您还可以链接多个Where()方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM