не может преобразовать лямбда-выражение в Func <T, TResult> при попытке передать IQueryable <T> - PullRequest
0 голосов
/ 18 марта 2011

Так что я опубликовал это раньше. IAsyncRepository или IObservableRepository для silverlight 4 + Службы данных WCF

Я работал над AsyncRepo для Silverlight, поэтому я просто застрял в небольшом месте.

Код только для объяснения ... прокрутите вниз, чтобы найти код преступника.

У меня есть репо, определенное так:

public interface IAsyncRepository<T> where T : class
{
    void GetById(int id, Action<T> callback);
    void GetAllFromQuery(Func<MyEntities, IQueryable<Product>> funcquery, Action<IList<Calculator>> callback)
}

Я использую WCF Data Services + Linq to Entities. Первый отлично работает вот так:

    public void GetById(int id, Action<Product> callback)
    {
        MyEntities dat = new MyEntities(new Uri(..url..));
        var query = from c in dat.Products where c.ID == id select c;//WATCH THIS
        allQuery = new DataServiceCollection<Product>(dat);
        allQuery.LoadAsync(query);
        allQuery.LoadCompleted += (obj, evt) =>
            {
                if (allQuery == null)
                {
                    callback(null);
                }
                else
                {
                    callback(allQuery.FirstOrDefault());
                }
            };
    }

Теперь ко второму способу:

Если вы заметили в приведенном выше методе, у меня есть запрос linq , который я использую для получения данных. Во втором методе репо Я хочу передать этот запрос от потребителя в метод.

Так что теперь ..

    public void GetAllFromQuery(Func<MyEntities, IQueryable<Product>> funcquery, Action<IList<Product>> callback)
    {
        MyEntities dat = new MyEntities(..uri..);
        allQuery = new DataServiceCollection<Product>(dat);
        allQuery.LoadAsync(funcquery(dat));
        allQuery.LoadCompleted += (obj, evt) =>
        {
            if (allCalcQuery == null)
            {
                callback(null);
            }
            else
            {
                callback(allQuery.ToList());
            }
        };
    }

Пока никаких проблем ... пока ...

Я использую это так:

        repo.GetAllFromQuery(
            x => from p in x.Products where p.ID > 5 select p,
            y => Assert.IsTrue(y.Count > 0));

Это дает мне:

cannot convert from 'lambda expression' to System.Func<MyEntities,IQueryable<Product.Calculator>>'

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

1 Ответ

4 голосов
/ 18 марта 2011

РЕДАКТИРОВАТЬ: Хорошо, теперь опечатка исправлена, попробуйте версию без запроса (которая в любом случае, я думаю, проще):

repo.GetAllFromQuery(
    x => x.Products.Where(p => p.ID > 5),
    y => Assert.IsTrue(y.Count > 0));
...