[英]How to return single value from anonymous Linq.Expressions.Expression
在LINQ中使用Entity Framework時,我可以編寫如下代碼:
var a = context.Employee.Where(x => x.Name.Equals("Michael")).FirstOrDefault();
我很好奇如何使用匿名linq表達式創建自定義方法。 我有一個模型類和方法如下
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");
您可以直接致電FirstOrDefault
var a = context.Employee.FirstOrDefault(x => x.Name.Equals("Michael"));
或者在你的功能里面你可以使用
return employees.FirstOrDefault(predicate);
嘗試使用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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.