'Contains()' workaround using Linq to Entities?

前端 未结 10 1989
清酒与你
清酒与你 2020-11-22 14:01

I\'m trying to create a query which uses a list of ids in the where clause, using the Silverlight ADO.Net Data Services client api (and therefore Linq To Entities). Does any

相关标签:
10条回答
  • 2020-11-22 14:50

    I think a Join in LINQ can be a walkaround.

    I haven't tested the code though. Hope it helps. Cheers. :-)

    List<long?> txnIds = new List<long?>();
    // Fill list 
    
    var q = from t in svc.OpenTransaction
            join tID in txtIds on t equals tID
            select t;
    

    Join in LINQ:

    http://weblogs.asp.net/salimfayad/archive/2008/07/09/linq-to-entities-join-queries.aspx

    0 讨论(0)
  • 2020-11-22 14:51

    I'm not sure about Silverligth, but in linq to objects i always use any() for these queries.

    var q = from t in svc.OpenTranaction
            where txnIds.Any(t.OpenTransactionId)
            select t;
    
    0 讨论(0)
  • 2020-11-22 14:56

    Here's an example where I demonstrate how to write set-based queries using the DataServiceContext : http://blogs.msdn.com/phaniraj/archive/2008/07/17/set-based-operations-in-ado-net-data-services.aspx

    0 讨论(0)
  • 2020-11-22 14:57

    To complete the record, here's the code I finally used (error checking omitted for clarity)...

    // How the function is called
    var q = (from t in svc.OpenTransaction.Expand("Currency,LineItem")
             select t)
             .Where(BuildContainsExpression<OpenTransaction, long>(tt => tt.OpenTransactionId, txnIds));
    
    
    
     // The function to build the contains expression
       static System.Linq.Expressions.Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(
                    System.Linq.Expressions.Expression<Func<TElement, TValue>> valueSelector, 
                    IEnumerable<TValue> values)
            {
                if (null == valueSelector) { throw new ArgumentNullException("valueSelector"); }
                if (null == values) { throw new ArgumentNullException("values"); }
                System.Linq.Expressions.ParameterExpression p = valueSelector.Parameters.Single();
    
                // p => valueSelector(p) == values[0] || valueSelector(p) == ...
                if (!values.Any())
                {
                    return e => false;
                }
    
                var equals = values.Select(value => (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Equal(valueSelector.Body, System.Linq.Expressions.Expression.Constant(value, typeof(TValue))));
                var body = equals.Aggregate<System.Linq.Expressions.Expression>((accumulate, equal) => System.Linq.Expressions.Expression.Or(accumulate, equal));
                return System.Linq.Expressions.Expression.Lambda<Func<TElement, bool>>(body, p);
            }
    
    0 讨论(0)
提交回复
热议问题