我使用了我在在线教程上看到的存储库模式...
除了查找方法外,一切都很好,我不知道如何使用此方法,而且我很难理解表达式或功能类型。我以前曾使用过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>
。