我正在尝试创建一个查询,它使用where子句中的I列表,使用Silverlight ADO.Net数据服务客户端api (因此也是Linq to Entities)。有没有人知道包含不受支持的解决方法?
我想做这样的事情:
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‘不受支持”。
发布于 2009-01-01 06:03:58
您可以回到手头编写一些e-sql (请注意关键字"it"):
return CurrentDataSource.Product.Where("it.ID IN {4,5,6}");
下面是我用来从集合YMMV生成一些e-sql的代码:
string[] ids = orders.Select(x=>x.ProductID.ToString()).ToArray();
return CurrentDataSource.Products.Where("it.ID IN {" + string.Join(",", ids) + "}");
发布于 2008-12-17 14:31:22
来自MSDN
static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(
Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
{
if (null == valueSelector) { throw new ArgumentNullException("valueSelector"); }
if (null == values) { throw new ArgumentNullException("values"); }
ParameterExpression p = valueSelector.Parameters.Single();
// p => valueSelector(p) == values[0] || valueSelector(p) == ...
if (!values.Any())
{
return e => false;
}
var equals = values.Select(
value => (Expression)Expression.Equal(valueSelector.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);
}
然后查询变成:
var query2 = context.Entities.Where(BuildContainsExpression<Entity, int>(e => e.ID, ids));
发布于 2008-12-17 11:41:59
我不确定Silverligth,但在linq to objects中,我总是使用any()进行这些查询。
var q = from t in svc.OpenTranaction
where txnIds.Any(t.OpenTransactionId)
select t;
https://stackoverflow.com/questions/374267
复制相似问题