2016-09-27 60 views
1

返回一個值當使用實體框架與LINQ我可以代碼,如:
var a = context.Employee.Where(x => x.Name.Equals("Michael")).FirstOrDefault();

我很好奇如何創建匿名LINQ表達式自定義的方法。 我有一個模型類和方法,遵循如何從匿名Linq.Expressions.Expression

public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

static T Single<T>(Expression<Func<T, bool>> predicate) where T : class 
{ 
    //This is from the database 
    List<Employee> employees = new List<Employee> 
    { 
     new Employee { Id = 1, Name = "Michael" }, 
     new Employee { Id = 2, Name = "Derek" } 
    }; 

    //I have no idea how to return single value of employees 

    //var expression = (BinaryExpression)predicate.Body; 
    //var left = expression.Left.Type.Name; 
    //Func<T, bool> func = predicate.Compile(); 
    //T value = method(html.ViewData.Model); 
    //T t = (T)Convert.ChangeType(a, typeof(T)); 
    //Employee emp = (Employee)Convert.ChangeType(t, typeof(Employee)); 

    //var body = predicate.Body; 

    //var prop = (PropertyInfo)((MemberExpression)predicate.Body).Member; 
    //var propValue = prop.GetValue(func, null); 

    //var parameter = Expression.Parameter(typeof(T)); 
    //var property = Expression.Property(parameter, expression.Member.Name); 
    //var equal = Expression.Equal(property, Expression.Constant(propValue)); 
    //var lambda = Expression.Lambda<Func<T, bool>>(equal, parameter); 


    return null; 
} 

調用上面的方法應該是這樣

Employee emp = Single<Employee>(d => d.Name == "Michael"); 
+0

你有沒有嘗試過'AsQuerable()。Where(predicate).FirstOrDefault'? – Valentin

+0

@Valentin不,我不會。我想要自定義方法。 – derodevil

回答

0

可以調用FirstOrDefault直接

var a = context.Employee.FirstOrDefault(x => x.Name.Equals("Michael")); 

或者你的函數裏面,你可以使用

return employees.FirstOrDefault(predicate); 
+0

不,我想創建自己的通用自定義方法。 – derodevil

+1

在你的Single方法中使用這個 返回employees.FirstOrDefault(predicate); –

0

嘗試使用IQuerable.Where而不是IEnumerable.Where 第一個使用Expression<Func<TSource, Boolean>>作爲參數。第二使用Func<TSource, Boolean>

所以你需要使用AsQuerable()然後Where() 所以你的情況應該看起來像

return employees.AsQuerable().Where(predicate).FirstOrDefault() 

如果你想通過delegate,而不是Expression你需要改變方法static T Single<T>(Func<T, bool> predicate) where T : class然後 return employees.FirstOrDefault(predicate)

所以你可以這樣使用它

Employee emp = Single<Employee>(d => d.Name == "Michael");

+0

我知道。但這不是我自己的習慣方法。 – derodevil

+0

@derodevil我已經更新了答案 – Valentin

+0

正如我所說的,我想要我自己的通用自定義方法。我想要的只是如何從匿名Linq.Expressions.Expression中獲得單個值。我知道你的意思,但這不是我想要的 – derodevil