2009-11-03 1 views
0

У меня возникла проблема при использовании LINQ для установки предложения where в запросе в вызове службы домена.Где предложение при вызове службы домена

Если я не устанавливаю предложение where, это работает отлично, и я возвращаю результат в своем завершенном событии (я только реализовал обработчик событий для завершенного события, чтобы продемонстрировать мою проблему здесь).

LoadOperation<User> load = 
    _Context.Load(_Context.GetUsersQuery()); 
load.Completed += (se, ea) => 
    MyList.ItemsSource = load.Entities.FirstOrDefault(); 

Если я ставлю предложение where в запрос, я просто получаю пустой список. И там, где пункт должен возвращать 1 строку :)

LoadOperation<User> load = 
    _Context.Load(_Context.GetUsersQuery().Where(f => f.UserID == UserID)); 
load.Completed += (se, ea) => 
    MyList.ItemsSource = load.Entities.FirstOrDefault(); 

Любая обратная связь будет оценена!

ответ

1

AFAIK Я не верю, что можно поставить предложение where в запросах RIA Services таким образом. Вам необходимо реализовать метод в своей службе, который принимает UserID и помещает предложение where в запрос в службе.

Вот пример из Brad Abram's blog series on the subject:

public IQueryable<SuperEmployee> GetSuperEmployee(int employeeID) 
{ 
    return Context.GetEmployees().ToList() 
      .Where(emp => emp.EmployeeID == employeeID).AsQueryable(); 

} 
+0

вы можете сказать мне, что будет, если запрос EmployeeID заменяется IList employeeIds, и я хочу, чтобы найти все emp.employeeID в employeeIds. .. Я надеюсь, что с моим вопросом было ясно – Sumit

+0

Я думаю, что вы должны опубликовать этот вопрос в качестве вопроса, а не комментария. – Bryant

0

Согласно этому post

"в" не является допустимым синтаксисом при вызове RIA услуг. Однако вы можете создать предикатное выражение, которое будет делать то, что «in» будет делать.

Использование:

var ids = new[] { 10, 20,30}; 
var inExpression = BuiltInExpression (ids); 

EntityQuery<Product> listQuery = 
    ProductContext.GetProductsQuery().Where(inExpression); 

Поддержка Код:

static Expression<Func<Product, bool>> BuiltInExpression(int[] ids) 
{ 
var inputExpression = Expression.Parameter(typeof(Product), "input"); 
var valueExpression = Expression.Property(inputExpression, s_propertyInfo); 
var inExpression = 
ids 
.Aggregate( 
default(Expression), 
(acc, v) => 
{ 
    var vExpression = Expression.Constant(v, typeof(int?)); 
    var compareExpression = Expression.Equal(valueExpression, vExpression); 
    if (acc == null) 
    { 
    return compareExpression; 
    } 
    return Expression.OrElse(acc, compareExpression); 
}); 

inExpression = inExpression ?? Expression.Constant(true); 
return Expression.Lambda<Func<Product, bool>>( 
    inExpression, 
    inputExpression 
); 

return inExpression; 

}