从多个参数组成LINQ到实体查询多个、实体、参数、LINQ

2023-09-03 05:32:04 作者:妃子终究不是后

我目前正在建立一个详细的搜索,我试图找出如何撰写我的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
 
精彩推荐
图片推荐