Entity Framework 实现 SQL “in”

本文介绍了一种在C#和VB.NET中构建LINQ查询的方法,该方法使用Lambda表达式来实现类似SQL IN子句的功能。通过传递选择器表达式和值集合,可以生成一个查询,用于检查实体属性是否包含在指定的值集中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blogs.msdn.com/dsimmons/pages/ef-faq-query.aspx

C#

 

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();

    // p => valueSelector(p) == values[0] || valueSelector(p) == ...

    if (!values.Any())

    {

        return e => false;

    }

    var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));

    var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));

    return Expression.Lambda<Func<TElement, bool>>(body, p);

}

 

var query2 = context.Entities.Where(

    BuildContainsExpression<Entity, int>(e => e.ID, ids));   

 

VB.NET

 

     Private   Function  BuildContainsExpression( Of  TElement, TValue) _
        (
ByVal  valueSelector  As  Expressions.Expression( Of  Func( Of  TElement, TValue)), _
         
ByVal  values  As  IEnumerable( Of  TValue)) _
          
As  Expressions.Expression( Of  Func( Of  TElement,  Boolean ))

        
If  valueSelector  Is   Nothing   Then
            
Throw   New  ArgumentNullException( " valueSelector " )
        
End   If

        
If  values  Is   Nothing   Then
            
Throw   New  ArgumentNullException( " values " )
        
End   If

        
If   Not  values.Any()  Then
            
Return   Function (n)  False
        
End   If

        
Dim  equals  =  values.Select( Function (n) Expressions.Expression.Equal _
                                       (valueSelector.Body, Expressions.Expression.Constant(n, 
GetType (TValue))))

        
Dim  body  =  equals.Aggregate( _
        (
Function (n1, n2) Expressions.Expression.Or(n1, n2)))

        
Dim  p  As  Expressions.ParameterExpression  =  valueSelector.Parameters.Single()

        
Return  Expressions.Expression.Lambda( Of  Func( Of  TElement,  Boolean ))(body, p)
    
End Function

 

 

转载于:https://www.cnblogs.com/rock_chen/archive/2010/01/07/1641593.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值