我使用了我在在线教程中看到的 Repository 模式......
除 find 方法外,一切正常,我不知道如何使用它,而且我很难理解 Expressions 或 Func 类型。我以前用过 linq 和 lambda,但我是初学者,仍然不能流畅地使用它们......
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()
将不会在数据库中执行整个查询。数据库查询(大致)如下所示:
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();
}
关于c# - 如何以 Func 类型的表达式作为参数调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42575888/