我有一点误会,我希望你能为我清楚。 我有一个名为:请求的表。
我想做查询,让我们说请求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表达式。
我几乎没有问题:
谢谢!!
答案 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();
}