LINQ表达式中的Func参数

时间:2013-08-23 22:42:00

标签: c# .net 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 ...
        }
    }

但是当我运行该方法时,我得到的错误就像LINQ实体中不支持节点类型一样。我也尝试使用predikate,但我根本没有运气。

任何想法如何解决?

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

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

1 个答案:

答案 0 :(得分:4)

如果您想使用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);