我使用了在线教程中看到的Repository模式...
一切正常,除了find方法,我不知道如何使用它,我很难理解表达式或Func类型。之前我使用过linq和lambda,但是我很开心,但仍然不能流利地使用它......
Button
我有这个模特课:
Button {
text: "click here"
property bool measuring: false
onClicked: {
if(!measuring){
console.time("button")
measuring=true
} else {
console.timeEnd("button")
measuring=false
}
}
}
我的问题是如何根据属性“Sifra”获取Artikl项目。我不知道如何调用这种方法...
public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
return Context.Set<TEntity>().Where(predicate);
}
答案 0 :(得分:4)
其他答案已经解释了如何使用表达式,但我想提一下在使用所谓的存储库模式时经常被忽略的一件事:
public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
return Context.Set<TEntity>().Where(predicate);
}
这会返回IEnumerable<TEntity>
,因此:
var result = _UnitOfWork.Artikl.Find(c => c.Sifra == 1).FirstOrDefault()
不将在数据库中执行整个查询。数据库查询将(大致)看起来像这样:
select * from Artikl where Sifra = 1 -- < not efficient
而不是这样:
select top 1 * from Artikl where Sifra = 1 -- < efficient
要解决此问题,您必须返回IQueryable
:
public IQueryable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
return Context.Set<TEntity>().Where(predicate);
}
或者为您要进行的每个查询制作单独的方法:
public TEntity FindFirst(Expression<Func<TEntity, bool>> predicate)
{
return Context.Set<TEntity>().Where(predicate).FirstOrDefault();
}
答案 1 :(得分:2)
您需要传递lambda expression以满足Expression<Func<TEntity, bool>> predicate
。您可以根据房产获得物品&#34; Sifra&#34;通过这样做:
var artikl = _UnitOfWork.Artikl.Find(q => q.Sifra == "some int value").FirstOrDefault();
希望它有所帮助!
答案 2 :(得分:1)
使用Expression<Func<TEntity, bool>>
就是这样,只需传入一个lambda表达式(伪代码):
var result = context.set.Find(x => x.Property == value);
所以在你的情况下:
var artiklList = _UnitOfWork.Artikl.Find(x => x.Sifra == 1);
var artikl = artiklList.FirstOrDefault();
不要忘记返回.FirstOrDefault()
,因为Find
结果将是IEnumerable<T>
。