【问题标题】:How can i write Linq WhereIn with Value1 ,Value2我如何用 Value1 ,Value2 编写 Linq WhereIn
【发布时间】:2014-05-05 13:25:21
【问题描述】:

我写 whereIn 扩展方法:

public static IQueryable<T> WhereIn<T, TValue>(this IQueryable<T> query,
                                               Expression<Func<T, TValue>> valueSelector,
                                               IEnumerable<TValue> values)
{
    return query.Where(BuildContainsExpression(valueSelector, values));
}

private static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(
    Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
{
    if (null == valueSelector)
    {
        throw new ArgumentNullException("valueSelector");
    }
    if (null == values)
    {
        throw new ArgumentNullException("values");
    }
    ParameterExpression p = valueSelector.Parameters.Single();
    TValue[] enumerable = values as TValue[] ?? values.ToArray();
    if (!enumerable.Any())
    {
        return e => false;
    }
    IEnumerable<Expression> equals =
        enumerable.Select(
            value =>
            (Expression) Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof (TValue))));
    Expression body = equals.Aggregate(Expression.Or);
    return Expression.Lambda<Func<TElement, bool>>(body, p);
}

我可以这样称呼它:

List<int> paymentTypeIds;

IQueryable<Order> iq = Entity.Order.AsQueryable();

iq = iq.WhereIn(h => h.PaymentType.Id, paymentTypeIds);

但我想将另一个参数传递给我的WhereIn 代码。我想让它看起来像这样:

iq = iq.WhereIn(h => h.PaymentType.Id || h.Bank.Id, paymentTypeIds);

我该怎么做?

【问题讨论】:

    标签: c# sql linq entity-framework linq-to-entities


    【解决方案1】:

    您不能使用语法h =&gt; h.PaymentType.Id || h.Bank.Id,因为int || int 没有定义。您可以使用params 轻松传递多个表达式。注意params必须是参数列表中的最后一个,所以我交换了顺序。

    public static IQueryable<T> WhereIn<T, TValue>(this IQueryable<T> query,
      IEnumerable<TValue> values,
      params Expression<Func<T, TValue>>[] valueSelectors)
    

    你会像这样使用它:

    iq = iq.WhereIn(paymentTypeIds, h => h.PaymentType.Id, h => h.Bank.Id);
    

    【讨论】:

    • 感谢您的回答,如果可以的话,您可以发送完整的代码(此扩展)吗?
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多