NET的LINQ to Entity模拟实现SQL的WHERE IN

1. [代码]构造Lambda语句     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/// <summary>
///   使之支持Sql in语法
/// </summary>
/// <typeparam name = "T"></typeparam>
/// <typeparam name = "TValue"></typeparam>
/// <param name = "query"></param>
/// <param name = "obj"></param>
/// <param name = "values"></param>
/// <returns></returns>
public static IQueryable<T> WhereIn<T, TValue>( this IQueryable<T> query, Expression<Func<T, TValue>> obj, IEnumerable<TValue> values)
{
    return query.Where(BuildWhereInExpression(obj, values));
}
 
private static Expression<Func<TElement, bool >> BuildWhereInExpression<TElement, TValue>(Expression<Func<TElement, TValue>> propertySelector, IEnumerable<TValue> values)
{
    ParameterExpression p = propertySelector.Parameters.Single();
    if (!values.Any())
       return e => false ;
 
    var equals = values.Select(value => (Expression)Expression.Equal(propertySelector.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);
}
 
// 下面是调用
string [] ids = new string []{10101,10005,10007};
db.Profile.WhereIn(c => c.Id,ids);

2. [代码]方法2(LINQ to SQL)     

?
1
2
3
4
int [] productList = new int [] { 1, 2, 3, 4 };
var myProducts = from p in db.Products
                  where productList.Contains(p.ProductID)
                 select p;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值