c# - 如何以 Func 类型的表达式作为参数调用方法

标签 c# entity-framework expression func

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

相关文章:

c# - WPF ListView.ItemsSource 绑定(bind)问题

c# - 在 TFS 和 visual studio 中管理数据库项目的最佳实践

c# - Crystal 报表和登录问题

c# - Entity Framework : Mapping sproc results to existing EF Entity

c# - 将 Qt GUI 代码集成到 C# 中

c# - 使用 C#.Net 播放 .WMV

vb.net - Linq to Entities 选择 Distinct

math - 就内存而言,在 Julia 中将公式保存为字符串还是表达式(符号)更好

c# - 基于数组生成动态LINQ表达式

java - 如何使用 EventHandler javafx 编写 lambda 表达式