C# 如何从匿名Linq.Expressions.Expression返回单个值

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

将实体框架与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 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为什么您认为
如果我使用实体框架,您的答案是正确的。