LINQ to Entities 实现sql 关键字"In"方式总结
2011-10-12 11:01
686 查看
在LINQ to Entities中没有办法再像 LINQ to SQL 中一样使用 Contains 的方法来实现sql "in" 关键字
下面代码在 LINQ to SQL 中可行 在LINQ to Entities却无法运行:
var s = db.Account.Select(c => c.ID);
var ret =(from t in db.Profile
where s.Contains(t.ID)
select t).ToList();
替代方法1:使用方法Any
var ids=db.Account.Select(c => c.ID);
var ret = (from t in db.Profile where ids.Any(c=>c==t.UserID) select t).ToList();
使用方法Any替换法搞了好久都没法实现直接对数组Any,下列代码仍无法执行:
int[] ids = new int[]{10101,10005,10007};
var ret = (from t in db.Profile where ids.Any(c=>c==t.UserID) select t).ToList();
于是继续Goolge寻找第二种方法,在MSDN论坛上找一个构造Lambda语句的方法
替代方法2:构造Lambda语句
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);
}
调用方法:
int[] ids = new int[]{10101,10005,10007};
db.Profile.Where(BuildWhereInExpression<Profile,int>(v=>v.Id,ids);
该方法可也扩展为:
public static IQueryable<TElement> WhereIn<TElement, TValue>(this IQueryable<TElement> source, Expression<Func<TElement, TValue>> propertySelector, params TValue[] values)
{
return source.Where(BuildWhereInExpression(propertySelector, values));
}
这样就可以直接使用下列方法调用
string[] ids = new string[]{10101,10005,10007};
db.Profile.WhereNotIn(c => c.Id,ids);
后来又看到网上有这样的解决办法
替代方法3:字符串构造
这个方法比较简单
string[] ids = new string[]{10101,10005,10007};
string csvIds = string.Join(",", ids.Cast<string>().ToArray());
db.Profile.Where("it.Id in {"+csvIds+"}");
it是什么这里就不用说了吧!
// if ($ != jQuery) {
$ = jQuery.noConflict();
}
var isLogined = true;
var cb_blogId = 22787;
var cb_entryId = 1527224;
var cb_blogApp = "ejiyuan";
var cb_blogUserGuid = "3d65360b-63cf-dd11-9e4d-001cf0cd104b";
var cb_entryCreatedDate = '2009/7/20 17:08:00';
// ]]>
下面代码在 LINQ to SQL 中可行 在LINQ to Entities却无法运行:
var s = db.Account.Select(c => c.ID);
var ret =(from t in db.Profile
where s.Contains(t.ID)
select t).ToList();
替代方法1:使用方法Any
var ids=db.Account.Select(c => c.ID);
var ret = (from t in db.Profile where ids.Any(c=>c==t.UserID) select t).ToList();
使用方法Any替换法搞了好久都没法实现直接对数组Any,下列代码仍无法执行:
int[] ids = new int[]{10101,10005,10007};
var ret = (from t in db.Profile where ids.Any(c=>c==t.UserID) select t).ToList();
于是继续Goolge寻找第二种方法,在MSDN论坛上找一个构造Lambda语句的方法
替代方法2:构造Lambda语句
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);
}
调用方法:
int[] ids = new int[]{10101,10005,10007};
db.Profile.Where(BuildWhereInExpression<Profile,int>(v=>v.Id,ids);
该方法可也扩展为:
public static IQueryable<TElement> WhereIn<TElement, TValue>(this IQueryable<TElement> source, Expression<Func<TElement, TValue>> propertySelector, params TValue[] values)
{
return source.Where(BuildWhereInExpression(propertySelector, values));
}
这样就可以直接使用下列方法调用
string[] ids = new string[]{10101,10005,10007};
db.Profile.WhereNotIn(c => c.Id,ids);
后来又看到网上有这样的解决办法
替代方法3:字符串构造
这个方法比较简单
string[] ids = new string[]{10101,10005,10007};
string csvIds = string.Join(",", ids.Cast<string>().ToArray());
db.Profile.Where("it.Id in {"+csvIds+"}");
it是什么这里就不用说了吧!
// if ($ != jQuery) {
$ = jQuery.noConflict();
}
var isLogined = true;
var cb_blogId = 22787;
var cb_entryId = 1527224;
var cb_blogApp = "ejiyuan";
var cb_blogUserGuid = "3d65360b-63cf-dd11-9e4d-001cf0cd104b";
var cb_entryCreatedDate = '2009/7/20 17:08:00';
// ]]>
相关文章推荐
- LINQ to Entities 实现sql 关键字"In"方式总结
- LINQ to Entities 实现sql 关键字"In"方式总结
- LINQ to Entities 实现sql 关键字"In"方式总结
- LINQ to Entities 实现sql 关键字"In"方式总结
- LINQ to Entities 实现sql 关键字"In"方式总结
- LINQ to Entities 实现sql 关键字"In"方式总结
- 学习并使用了两种linq to entity 的实现sql关键字in的查询方法
- 学习并使用了两种linq to entity 的实现sql关键字in的查询方法
- LinQ to SQL 及 non-LinQ方式实现Group的Performance对比
- linq to sql 中的in 操作实现
- LINQ To Entities如何实现查询 select * from tableA where id in (1,2,3,4) ?
- How do I write a LINQ to Entities query which has the equivalent of the SQL “in” keyword?
- LINQ中in的实现方法-LINQ To Entities如何实现查询 select * from tableA where id in (1,2,3,4)
- Linq to Sql 与Linq to Entities 生成的SQL Script与分页实现
- Linq to Sql 如何实现 in 与 not in
- 使用 LINQ To SQL 和实体框架实现灵活的数据访问
- 实现类似LINQ TO SQL的功能, 轻量级的数据访问组件
- 更新LINQ to SQL和LINQ to Entities 产品路线图
- MVC中使用LINQ TO SQL实现多表查询及分页
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains