VS2008下遇到的LINQ子查询问题

yaotomo 2014-02-24 09:16:01
只是做个试验,看子查询怎么弄,其实这个功能不用子查询就能实现的
CatId 和docId 都是int类型的

var q = from t in db.tDocInfo where (from s in db.tCatInfo where s.CatId < 3 select s.CatId).Contains(t.docId) select t;

报错
LINQ to Entities 不识别方法“Boolean Contains[Int32](System.Linq.IQueryable`1[System.Int32], Int32)”,因此该方法无法转换为存储表达式。

网上查了一下可能是Framework3.5不能这么用,不知道怎么改才能在VS2008下实现in查询的功能呢?请各位前辈指教
...全文
163 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaotomo 2014-02-25
  • 打赏
  • 举报
回复
谢谢6#大神,不报错了,可是没有任何查询结果啊。 按sql语句是可以查出结果的。。。 tDocInfo表里id<3的结果还是蛮多的
q107770540 2014-02-25
  • 打赏
  • 举报
回复
有简单粗暴的方法: var q = from t in db.tDocInfo.AsEnumerable() where (from s in db.tCatInfo.AsEnumerable() where s.CatId < 3 select s.CatId).Contains(t.docId) select t;
yaotomo 2014-02-25
  • 打赏
  • 举报
回复
to3#的朋友 这么写还是报原来的错,Linq有两种写法,这种是方法的写法,我写的是Linq语句的写法。Ef不支持子查询直接用Contains,所以才会报这个错。 to1#的朋友 Ef3.5里必须用拓展方法才能实现吗?有没有比较简单的方法?谢谢指点。
  • 打赏
  • 举报
回复
不怎么会linq 但是我觉得 .contains 应该是放在 .select 后面的吧 db.tDocInfo.Where(o => db.tCatInfo.Where(s => s.CatId < 3).Select(p => p.CatId ).Contains(o.docId)).ToList(); 不知道这样写可不可以
q107770540 2014-02-24
  • 打赏
  • 举报
回复
EF4以上版本,已经直接支持Contains 方法了
q107770540 2014-02-24
  • 打赏
  • 举报
回复
EF4以上版本,可以直接用 Any 方法来实现 EF3.5:

var q =  db.tDocInfo.WhereIn(t.docId,(from s in db.tCatInfo where s.CatId < 3 select s.CatId)) ; 


public static IQueryable<TEntity> WhereIn<TEntity, TValue>
  (
    this ObjectQuery<TEntity> query,
    Expression<Func<TEntity, TValue>> selector,
    IEnumerable<TValue> collection
  )
{
  if (selector == null) throw new ArgumentNullException("selector");
  if (collection == null) throw new ArgumentNullException("collection");
  if (!collection.Any()) 
    return query.Where(t => false);

  ParameterExpression p = selector.Parameters.Single();

  IEnumerable<Expression> equals = collection.Select(value =>
     (Expression)Expression.Equal(selector.Body,
          Expression.Constant(value, typeof(TValue))));

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

  return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p));
}

//Optional - to allow static collection:
public static IQueryable<TEntity> WhereIn<TEntity, TValue>
  (
    this ObjectQuery<TEntity> query,
    Expression<Func<TEntity, TValue>> selector,
    params TValue[] collection
  )
{
  return WhereIn(query, selector, (IEnumerable<TValue>)collection);
}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧