我目前正在建立一个详细的搜索,我试图找出如何撰写我的LINQ查询到我的实体。
I'm currently building a detailed search and I am trying to figure out how to compose my Linq query to my Entity.
基本上我的用户,可以选择列表中的控制1 *项。 的一部分,我不能环绕我的头如下:
basically I have users that can select 1* items in a list control. the part I can't wrap my head around is the following:
我怎么能动态地构建一个其中,并(字段等于这个或字段等于这个或...)子句 其中的项目数是变体
how can I dynamically build a Where AND( field is equal to this OR field is equal to this OR...) clause where the number of items is variant.
数据库域字段示例内容:'26,21,22,100,164,130
database Domain Field sample content : '26, 21, 22, 100, 164, 130'
示例:(我们的想法是能够产生此取决于所选择的项数)
Example: (The idea is to be able to generate this depending on the number of items selected)
Offre.Where(o=> o.Domain.Contains("26") || o.Domain.Contains("100") )
Offre.Where(o=> o.Domain.Contains("26") )
Offre.Where(o=> o.Domain.Contains("26") || o.Domain.Contains("100") || o.Domain.Contains("22") )
那么我就可以轻松拥有生成的查询作为一个IQueryable并添加到这个对象来构建我的查询。
then I can easily have the resulting query as an IQueryable and add on to this object to build my query.
可有人点我在矿井正确的方向,我和(或.. OR)条款?
can someone point me inthe right direction for my AND ( OR .. OR ) clause ?
要解决这个限制,您可以手动构建一个前pression(来源)
C#
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);
}
使用此实用程序方法,
Using this utility method,
var query2 = context.Entities.Where(BuildContainsExpression<Entity, int>(e => e.ID, ids));
VB.Net
Public Shared Function BuildContainsExpression(Of TElement, TValue)( _
ByVal valueSelector As Expression(Of Func(Of TElement, TValue)), _
ByVal values As IEnumerable(Of TValue) _
) As Expression(Of Func(Of TElement, Boolean))
' validate arguments
If IsNothing(valueSelector) Then Throw New ArgumentNullException("valueSelector")
If IsNothing(values) Then Throw New ArgumentNullException("values")
Dim p As ParameterExpression = valueSelector.Parameters.Single()
If Not values.Any Then
Return _
Function(e) False
End If
Dim equals = values.Select( _
Function(v) _
Expression.Equal(valueSelector.Body, Expression.Constant(v, GetType(TValue))) _
)
Dim body = equals.Aggregate( _
Function(accumulate, equal) _
Expression.Or(accumulate, equal) _
)
Return Expression.Lambda(Of Func(Of TElement, Boolean))(body, p)
End Function
使用此工具方法
Using this utility method
Dim query = m_data. Offer
If (selectedSectors.Count > 0) Then
query = query.Where(BuildContainsExpression(Function(o As Offer) o.Value, selectedSectors))
End If