我有点误会,希望你能帮我澄清一下。我有一张桌子叫:请求。
我想做查询,让我们用请求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表达式。
我没有什么问题:
谢谢!!
发布于 2011-05-06 02:19:32
这应该是可行的:
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检索结果,您刚刚定义了查询,这将导致消费者检索结果时出现的问题,因为只有这样才会执行DB查询--但是相应的DB上下文可能已经被释放了。在查询结束时追加.ToList(),以实现IQuerable<T>
我需要构建和高级搜索(我有6-7列),有一个共同的方法吗?
可以在.Where()扩展方法中组合多个子句,即Where( x=> x.A=="foo" && x.B == 42)。如果需要,还可以链接多个Where()方法。
发布于 2011-05-06 02:40:01
您的问题是Where返回对象集合(零到多)。你只想要一个物体。不能简单地将对象集合转换为单个对象。
相反,您应该得到First (或者如果您知道肯定只有一个您可以调用Single)。
关于2-这取决于你想做什么。您可以对结果集执行foreach,或者在将结果集放入列表之前从结果集中进行选择--但有时最有效的选项是先输入一个列表。
第三点,有很多可用的模式。同样,这取决于你在做什么,以及“搜索词”是如何工作的。例如,
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();
}https://stackoverflow.com/questions/5906013
复制相似问题