在EF中执行等效的SQL“in”

时间:2011-07-02 17:44:47

标签: c# entity-framework lambda

我有两个可评价对象ES,S包含在E中,所以你说E.S并且他们都使用相同的对象R来评价; R一次只能有一个评级对象,所以如果R.E.HasValue == true那么R.S.HasValue永远不会成真。

我有来自数据库的所有R对象,我有E.什么是lambda表达式来获取所有Rs在E.S中的R.S?



更新
我找到了MSDN Documentation,其中说:

  

引用非标量变量,   例如实体,在查询中不是   支持的。执行此类查询时   NotSupportedException异常是   抛出一条消息说明   “无法创建一个恒定值   输入EntityType。只有原始类型   ('如Int32,String和Guid')   在这种情况下得到支持。“

所以......自查询读取

以来,我无法使用A-Dubb的答案
R.Where(r => r.SID.HasValue).Where(r => E.S.Contains(r.S))

哪个会导致NotSupportedException ...我仍然拥有R.SID类型的属性int?,但我怎么能查询所有ES以获取其ID?

P.S。 E.S.是EntityCollection类型。

2 个答案:

答案 0 :(得分:3)

我会说IN子句通常用Contains来表示。例如

public class R {
   public int Id {get; set;}
}

public IEnumerable<R> InClause(IEnumerable<int> ids) {
   var subset = ids.ToList();

   return dbContext.Query<R>.Where(r => subset.Contains(r.Id));
}

我知道这不是EF中的确切API调用,但它应该有助于为您的解决方案设置基础。也许你已经知道如何生成IN子句但我想如果你这样做,那么你可能不会被卡住。如果IN子句不是查询的难点部分那么是什么?也许你提到的业务逻辑?同样,C#对象模型会有所帮助。

答案 1 :(得分:0)

使用contains的问题是,它更接近sql“like”而不是“in”。因此,如果您有用户输入说8位数ID和某人  输入0然后包含将返回所有id的零,其中包含零。