如何用类型func作为参数调用方法



我使用了我在在线教程上看到的存储库模式...

除了查找方法外,一切都很好,我不知道如何使用此方法,而且我很难理解表达式或功能类型。我以前曾使用过Linq和Lambda,但我仍然是Begginer,但仍然不会流利...

public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
    return Context.Set<TEntity>().Where(predicate);
}

我有这个模型类:

public partial class Artikl
{
        [Browsable(false)]
        public int IDArtikli { get; set; }
        public string Barkod { get; set; }
        [DisplayName("Šifra")]
        public Nullable<int> Sifra { get; set; }
        public string Naziv { get; set; }
        [DisplayName("JM")]
        public string JedinicaMjere { get; set; }
        public decimal Tarifa { get; set; }
        [DisplayName("Prodajna")]
        public Nullable<decimal> ProdajnaCijena { get; set; }
        [Browsable(false)]
        public Nullable<bool> Flag { get; set; }
        public Nullable<decimal> Kalo { get; set; }
        [DisplayName("Nabavna")]
        public Nullable<decimal> NabavnaCijena { get; set; }
        [DisplayName("Veleprodajna")]
        public Nullable<decimal> VeleprodajnaCijena { get; set; }
        public Nullable<decimal> Zalihe { get; set; }
 }

我的问题是如何根据属性" Sifra"获得Artikl项目。我不知道如何称呼此方法...

private void txtSifra_TextChanged(object sender, EventArgs e)
{
     var artikl = _UnitOfWork.Artikl.Find(???);
     txtNaziv.Text = artikl.Naziv;
}

其他答案已经解释了如何使用表达式,但我想提一下,当使用所谓的存储库模式时通常会忽略一件事:

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()

Will 不是在数据库中执行整个查询。数据库查询将(大致)如下:

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();
}

您需要传递lambda表达式以满足Expression<Func<TEntity, bool>> predicate。您可以通过此操作获得基于属性" Sifra"的项目:

var artikl = _UnitOfWork.Artikl.Find(q => q.Sifra == "some int value").FirstOrDefault();

希望它有帮助!

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>

相关内容

最新更新