时间:2021-04-16
在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+"}");
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
摘要:本文介绍Linq查询基本操作(查询关键字)-from子句-where子句-select子句-group子句-into子句-orderby子句-join子句
本文实例分析了C#中var关键字用法。分享给大家供大家参考。具体方法如下:C#关键字是伴随着.NET3.5以后,伴随着匿名函数、LINQ而来,由编译器帮我们推断
其实现在很多文章都告诉我们,准确定位的关键字比长尾关键字的转化率要高,但是流量却不及长尾关键字!其实长尾关键字也能带来高的转化率,然而笔者对关键字的定位是标
sqlserver2008不支持关键字limit,所以它的分页sql查询语句将不能用MySQL的方式进行,幸好sqlserver2008提供了top,rownu
目前javascript的实现继承方式并不是通过“extend”关键字来实现的,而是通过constructorfunction和prototype属性来实现继承