0

我有一点误解,我希望你能帮我弄清楚。我有一个表叫:请求。

我想做查询,可以通过 Request 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 列),有没有常见的方法?

谢谢 !!

4

2 回答 2

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()如有必要,您还可以链接多个方法。

于 2011-05-06T02:19:32.763 回答
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();
}
于 2011-05-06T02:40:01.643 回答