How to search records from a table with a compound key in EF6?

I created my database schema using Entity Framework Code First, and one of the models has a composite key (which is perfectly reflected in db).

However, when I try to search for entries using a list of compound keys, I get an exception that says: “It is not possible to create a constant value of type“ Anonymous type. ”In this context, only primitive or enumeration types are supported.

This is the code I used last that didn't work (variants of this also caused the same error):

var ids = models.Select(m => new { m.Id, m.InstanceId })
                .ToArray();

var records = _dataService.TableWithCompositeKey
                          .Where(t => ids.Contains(new { t.Id, t.InstanceId }))
                          .ToArray();

An exception occurs when evaluating records. So how can I accomplish such a task?

+4
source share
1 answer

EDIT:
, - . can not , EF.

Context.Set<poco>.Find()
. Ef Source public virtual TEntity Find(params object[] keyValues)

var record = _dataService.TableWithCompositeKey
                         .Find( Id, InstanceId )
                         .ToList();

where , , :

a)   ...
         (, )

b) where   - Predicate builder, . , where         Thischeck = (a = X b = Y)//, (Tpoco t) = > value.Equals(t.PropertyName)     Whereclause.Or(thisCheck)

. , . , Where, , . .

, Linq , .

.

/// See http://www.albahari.com/expressions for information and examples.
public static class PredicateBuilder
{
    public static Expression<Func<T, bool>> True<T> () { return f => true; }
    public static Expression<Func<T, bool>> False<T> () { return f => false; }

    public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
                                              Expression<Func<T, bool>> expr2)
    {
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
             (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
    }

    public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
                                               Expression<Func<T, bool>> expr2)
    {
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
             (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
    }
}
0

All Articles