如何调用一个不带参数的方法,该方法返回Expression<;Func<;模型,字符串>>;

本文关键字:方法 gt lt 返回 Func 字符串 模型 Expression 调用 何调用 一个 | 更新日期: 2023-09-27 18:00:05

我有一个这样的方法(非常简化的版本):

public static Expression<Func<MyModel, String>> GetSomeStatus()
{
    return myModel => myModel.IsTrue ? "That's true" : "That's false";
}

那么,我怎么能在这样的声明中称之为:

var efRequest = db.Table1.Where(...)
                            .Select(x => new MyAnotherModel
                            {
                                Status = ""; // call GetSomeStatus() here; x is of MyModel type
                            })

注意:我最初的问题是调用一些助手方法,该方法在Select方法中返回String,但当然我遇到了像Linq to entities doesn't recognize this method...这样的异常,所以我试图重写它(参见上面的示例),但现在我不知道如何调用它(我在EF中相对较新)。我知道在Select之前有一个简单的AsEnumerable调用,它解决了我最初的问题,但我想将此查询保留为IQueryable,以备以后使用。

如何调用一个不带参数的方法,该方法返回Expression<;Func<;模型,字符串>>;

这是不可能的。但您可以使用例如LINQKit AsExpandableInvoke的扩展方法,如以下所示:

首先,您需要将表达式存储在一个变量中,否则您将得到著名的Linq to entities doesn't recognize this method...异常:

var getSomeStatus = GetSomeStatus();

然后在查询中使用它(在调用AsExpandable之后,因此正确地对生成的查询表达式树进行后处理):

var efRequest = db.Table1.AsExpandable()
    .Where(...)
    .Select(x => new MyAnotherModel
    {
        Status = getSomeStatus.Invoke(x)
    });