如何使用Func类型的Expression作为参数调用方法

时间:2017-03-03 10:03:25

标签: c# entity-framework expression func

我使用了在线教程中看到的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);
}

3 个答案:

答案 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>