2013-09-09 2 views
2

Я проверил другие вопросы, и я считаю, что это должно работать:Ошибка на Linq To Entities метода содержит NotSupportedException

private static List<Duck> GetDucks(this DataServiceContext ctx, params int[] ids) 
{ 
    return ctx.CreateQuery<Duck>("Ducks").Where(x => ids.Contains(x.DuckID)).ToList(); 
} 

Я получил NotSupportedException: Метод «содержит» не поддерживается.

Я изменил запрос на

Where(x => ids.Any(id => id == x.DuckID) 

Я получил сообщение: Метод «Любые» не поддерживается, когда MaxProtocolVersion меньше, чем «3,0»

Затем я построил DataServiceContext а, по-разному:

public static DataServiceContext Context 
{ 
    get { return new DataServiceContext(baseUri, DataServiceProtocolVersion.V3); } 
} 

После этого я получил сообщение: NotSupportedException: Параметр источника для метода «Любой» должен быть либо навигационным, либо коллекционным имуществом

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

EDIT

я использовал MaxProtocolVersion 3 и клиент и сервер на стороне.

В любом случае это конкретное сообщение об ошибке исчезло, так как я больше не пытаюсь вернуть подмножество данных. Я просто получаю полный список сущностей перед работой (хотя это потребует дальнейшего рассмотрения/оптимизации). Я ошибочно полагал, что если бы у меня был временный DataServiceContext, который был пустым, мне пришлось бы получить объекты, которые я хотел бы обновить, а затем сохранить их обратно (под влиянием различных примеров выполнения обновлений, которые я нашел). Конечно, метод AttachTo (EntitySetName, entity) - правильное решение. Затем вы можете позвонить UpdateObject (entity) до TempContext.SaveChanges().

+0

Можете ли вы показать трассировку стека? Это похоже на проблему с службами данных WCF. – Pawel

+0

@Pawel Это не проблема с WCF, поскольку я могу использовать предложение where без использования метода Contains, такого как x.DuckID == 5 –

+1

Я не знаю. Показать трассировку стека. Например, это сообщение «Метод« Любой »не поддерживается, когда MaxProtocolVersion меньше, чем« 3.0 », наверняка возвращается из служб данных WCF, поэтому я не знаю, откуда приходит NotSupportedException - Data Services или EF. – Pawel

ответ

0

Из того, что я узнал, похоже, что поддержка LINQ в этом сценарии ограничена, хотя я до сих пор не знаю, почему содержимое не работает в DataServiceQuery. Документация MSDN предполагает, что она поддерживается. Запросы к DataServiceContext разрешения URLs в OData format:

http://services.odata.org/OData/OData.svc/Category(1)/Products $ топ = 2 & $ OrderBy = имя

Решение, которое я использовал - добавление службы WCF Data операции/метод:

[WebGet] 
    public IQueryable<Thing> GetThingsByID(string ids) 
    { 
     return CurrentDataSource.Things.Where(x => ids.Contains(x.ThingID.ToString())).AsQueryable(); 
    } 

выше, должны позволить мне фильтровать:

WCF Data Service operations

Calling Service Operations

я прохожу в качестве идентификаторов, как только томами CSV примитивных типов данных могут быть передан в качестве параметров

Примечания: Содержит работу по DbContext.