LINQ 表达式中的 Func 参数

Mil*_*anG 2 .net c# linq

我对 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 ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,当我运行该方法时,出现错误,例如 LINQ 实体中不支持节点类型。我也尝试过使用 predikate 版本,但我一点运气都没有。

任何想法如何解决它?

我找到了一种可能的方法。LINQ 执行延迟执行,所以我必须首先像这样强制执行:

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

Rap*_*aus 5

如果你想在 a 上工作IQueryable<T>,你的参数必须是 an Expression<Func<T, int>>,而不是 a Func<T, int>。

Func<T, int>将与IEnumerable<T>.

Whereextensions 方法与IQueryable<T>and同名IEnumerable<T>,但参数不同...

(顺便说一句,你可以写repository.Items.FirstOrDefault(x => keyExtractor(x) == id);