LINQ表达式中的Func参数

本文关键字:Func 参数 表达式 LINQ | 更新日期: 2023-09-27 18:29:01

LINQ表达式中的Func委托有问题。这是该方法的问题部分(repository.Items是IQueryable<T>):

public static ActionResult XXX<T>(IRepository<T> repository,
        Func<T, int> keyExtractor, int id = 0)
    {
        if (id == 0) return ...
        T item = repository.Items.Where(x => keyExtractor(x) == id).
           FirstOrDefault();
        if (item == null) return ...
        try {
            repository.DeleteItem(item);
            return ...
        } catch (Exception e) {
            return ...
        }
    }

但当我运行该方法时,我会得到类似LINQ实体中不支持节点类型的错误。我也试过用普瑞凯特的版本,但我一点运气都并没有。

有什么办法吗?

我找到了一种可能的方法。LINQ执行延迟执行,所以我必须首先执行如下:

T item = repository.Items.AsEnumerable().Where(x => keyExtractor(x) == id)

LINQ表达式中的Func参数

如果要处理IQueryable<T>,参数必须是Expression<Func<T, int>>,而不是Func<T, int>

Func<T, int>将与IEnumerable<T>一起工作。

Where扩展方法对IQueryable<T>IEnumerable<T>具有相同的名称,但参数不同。。。

(顺便说一下,您可以编写repository.Items.FirstOrDefault(x => keyExtractor(x) == id)