2017-03-19 73 views
-1

我使用存储库模式设计。创建linq表达式作为参数

和我的项目中的实体框架。

下面是来自Remository类中的方法:

public virtual IEnumerable<T> Find(Expression<Func<T, bool>> predicate) 
{ 
    return Entities.Where(predicate); 
} 

在这行我从数据库中获取来自SensorsMeasure表中的所有行,其中SensorUnitId为5:

public void deleteItem(int sensorId, UnitOfWork unitOfWork) 
    { 
     sensorId=5; 
     var items = unitOfWork.SensorsMeasure.Find(sensorId);    
    } 

但在该行:

public void deleteItem(int sensorId, UnitOfWork unitOfWork) 

我收到此错误:

cannot convert from 'int' to 'System.Linq.Expressions.Expression<System.Func<SensorObservation.Data.SensorsMeasure, bool>>' SensorObservation.Model 

我怎么能写find()方法是获取所有记录表,其中SensorUnitId是5

+0

你在找什么是'lambda表达式'检查了解它:https://msdn.microsoft.com/en-us/library/bb397687.aspx –

回答

3

你exeception是你Find方法需要一个谓词表达式作为参数,该参数的原因,而你试图通过整数,在delete item中使用Find。所以,你需要写这样的事:

public void deleteItem(int sensorId, UnitOfWork unitOfWork) 
{ 
    sensorId=5; 
    var items = unitOfWork.SensorsMeasure.Find(sm => sm.Id == sensorId);    
} 

此外,你会发现,那sm.Id建议立即进行删除被替换,根据EF模型您的ID属性的名称。

PS:AFAIK,在c#中命名您的方法时,使用camel case并不是一个好习惯。尝试DeleteItem而不是deleteItem。另外,不确定是否需要将UnitOfWork类的实例作为参数直接注入deleteItem方法。考虑将它传递给一个实现了deleteMethod的类的构造函数。

+0

通常我们需要一些基本的努力来解决这个问题。此外,值得添加最近添加到C#的“本地函数”。它会更有效率和可读性 –