【发布时间】:2016-09-12 14:58:56
【问题描述】:
我需要一个在实体框架中工作的自定义表达式。该方法应具有以下签名:
var ids = new List<int> { 1, 2, 3 };
Context.FooEntities.WithoutId(e => e.Id, ids);
这应该给我所有Foo 实体,它们不具有与列表中匹配的Id 属性。
我的尝试基于existing example here。
public static IQueryable<T> WithoutId<T>(
this IQueryable<T> entities,
Expression<Func<T, int>> propertySelector,
ICollection<int> ids) {
var property = (PropertyInfo)((MemberExpression)propertySelector.Body).Member;
ParameterExpression parameter = Expression.Parameter(typeof(T));
var expression = Expression.Lambda<Func<T, bool>>(
Expression.Not(
Expression.Call(
Expression.Constant(ids),
typeof(ICollection<int>).GetMethod("Contains"),
Expression.Property(parameter, property))),
parameter);
return entities.Where(expression);
}
问题是当ids 为空时,它会返回所有实体。 它应该不返回任何实体。
【问题讨论】:
-
奇怪的要求。你想排除一些id,如果没有要排除的id,不排除什么是正常的,即包含一切,即返回所有实体。
-
@IvanStoev 不,它不应该返回任何实体。它应该返回一个空集。
-
@hbob - 我想他明白了,他说这是不合逻辑的操作。
-
@ErikFunkenbusch 也许你是对的......虽然你能用形式逻辑描述为什么它不合逻辑吗?我不记得到底该怎么做,但似乎这不是逻辑问题,而是期望:“给我所有 ID 不是 {nothing} 的实体”。这是否意味着它们必须是“某物”?也许这在形式上是不合逻辑的,我不知道,想想就头疼:-)
-
@hbob - 在集合论(Link 和 SQL 所基于的)中,“无”被称为“空集”。这就像一个空集合。所以是的,说某事不包括空集意味着返回所有内容(除了空集,这是你想要返回的,所以它与逻辑期望相反)
标签: c# entity-framework linq expression func