C# 如何从匿名Linq.Expressions.Expression返回单个值
将实体框架与LINQ一起使用时,我可以编写如下代码:C# 如何从匿名Linq.Expressions.Expression返回单个值,c#,linq,C#,Linq,将实体框架与LINQ一起使用时,我可以编写如下代码: 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 Sing
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;
}
公共类员工
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
静态T单(表达式谓词),其中T:class
{
//这是来自数据库的
列出员工=新名单
{
新员工{Id=1,Name=“Michael”},
新员工{Id=2,Name=“Derek”}
};
//我不知道如何回报员工的单一价值
//var expression=(BinaryExpression)predicate.Body;
//var left=expression.left.Type.Name;
//Func Func=谓词.Compile();
//T值=方法(html.ViewData.Model);
//T=(T)Convert.ChangeType(a,typeof(T));
//emp=(Employee)Convert.ChangeType(t,typeof(Employee));
//var body=谓词.body;
//var prop=(PropertyInfo)((MemberExpression)predicate.Body.Member;
//var propValue=prop.GetValue(func,null);
//var参数=表达式参数(typeof(T));
//var property=Expression.property(参数,Expression.Member.Name);
//var equal=表达式.equal(属性,表达式.常量(propValue));
//var lambda=表达式.lambda(等于,参数);
返回null;
}
调用上述方法应类似于
Employee emp = Single<Employee>(d => d.Name == "Michael");
emp=Single(d=>d.Name==“Michael”);
您可以直接调用FirstOrDefault
var a = context.Employee.FirstOrDefault(x => x.Name.Equals("Michael"));
或者在你的函数中你可以使用
return employees.FirstOrDefault(predicate);
您可以直接调用FirstOrDefault
var a = context.Employee.FirstOrDefault(x => x.Name.Equals("Michael"));
或者在你的函数中你可以使用
return employees.FirstOrDefault(predicate);
尝试使用IQuerable.Where
而不是IEnumerable.Where
第一个使用表达式
作为参数。第二个使用Func
因此,您需要使用asqueryable()
,然后使用Where()
所以在你的情况下应该是
return employees.AsQuerable().Where(predicate).FirstOrDefault()
如果要传递委托
而不是表达式
,则需要将方法更改为静态T Single(Func谓词),其中T:class
,然后
return employees.FirstOrDefault(谓词)
所以你可以这样使用它
emp=Single(d=>d.Name==“Michael”)代码>尝试使用IQuerable.Where
而不是IEnumerable.Where
第一个使用表达式
作为参数。第二个使用Func
因此,您需要使用asqueryable()
,然后使用Where()
所以在你的情况下应该是
return employees.AsQuerable().Where(predicate).FirstOrDefault()
如果要传递委托
而不是表达式
,则需要将方法更改为静态T Single(Func谓词),其中T:class
,然后
return employees.FirstOrDefault(谓词)
所以你可以这样使用它
emp=Single(d=>d.Name==“Michael”)
您是否尝试过AsQuerable().Where(谓词).FirstOrDefault
?@Valentin不,我不会。我想要自定义方法。您是否尝试过AsQuerable().Where(谓词).FirstOrDefault
?@Valentin不,我不会。我要自定义方法。我想创建自己的通用自定义方法。在单个方法return employees.FirstOrDefault(谓词)中使用它;否。我想创建自己的通用自定义方法。在单个方法return employees.FirstOrDefault(谓词)中使用此方法;我知道。但这不是我自己的自定义方法。正如我所说的,我想要我自己的通用自定义方法。我只想知道如何从匿名Linq.Expressions.Expression获取单个值。我知道你的意思,但不是我想的want@derodevil匿名Linq.Expressions.Expression中的单个值是什么意思?T是匿名类型。这可以是任何东西。我有各种类型的对象列表,我想创建一个自定义的泛型方法,该方法返回从对象列表中提取的精确类型的单个对象。如果我使用实体框架,你的答案是正确的。@derodevil为什么你认为如果我使用实体框架,你的答案是正确的。
?我知道。但这不是我自己的自定义方法。正如我所说的,我想要我自己的通用自定义方法。我只想知道如何从匿名Linq.Expressions.Expression获取单个值。我知道你的意思,但不是我想的want@derodevil匿名Linq.Expressions.Expression中的单个值是什么意思?T是匿名类型。这可以是任何东西。我有各种类型的对象列表,我想创建一个自定义的泛型方法,该方法返回从对象列表中提取的精确类型的单个对象。如果我使用实体框架,您的答案是正确的。@derodevil为什么您认为如果我使用实体框架,您的答案是正确的。
?