[英]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表达式。
我有几个问题:
谢谢 !!
这应该工作:
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.