使用Linq to Entities的“ Contains()”解决方法?

我正在尝试创建一个查询,该查询使用Silverlight ADO.Net数据服务客户端api(并因此使用Linq To

Entities)在where子句中使用ID列表。有人知道不支持“包含”的解决方法吗?

我想做这样的事情:

List<long?> txnIds = new List<long?>();

// Fill list

var q = from t in svc.OpenTransaction

where txnIds.Contains(t.OpenTransactionId)

select t;


试过这个:

var q = from t in svc.OpenTransaction

where txnIds.Any<long>(tt => tt == t.OpenTransactionId)

select t;

但是得到了“不支持方法’Any’”。

回答:

EF≥4 Contains直接支持(Checkout

Any),因此您不需要任何解决方法。

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);

}

用法:

public static void Main()

{

using (MyObjectContext context = new MyObjectContext())

{

//Using method 1 - collection provided as collection

var contacts1 =

context.Contacts.WhereIn(c => c.Name, GetContactNames());

//Using method 2 - collection provided statically

var contacts2 = context.Contacts.WhereIn(c => c.Name,

"Contact1",

"Contact2",

"Contact3",

"Contact4"

);

}

}

以上是 使用Linq to Entities的“ Contains()”解决方法? 的全部内容, 来源链接: utcz.com/qa/412699.html

回到顶部