Linq to Sql не поддерживает перевод на SQL - PullRequest
1 голос
/ 03 апреля 2012

Я получаю Linq to Sql has no supported translation to SQL в строке ниже.Может быть, кто-нибудь может объяснить, как это можно решить?

UsersCount = _repository.GetUsers(p.Id).Count()

Полный код

public IQueryable<ProductViewModel> Build()
{
 return _repository.GetProducts(true).Select(p=> new ProductViewModel
   {
  Id = p.Id, 
  Name = p.Name,
  UsersCount = _repository.GetUsers(p.Id).Count()
   });         
}


public IQueryable<User> GetUsers(int productId)
{
    return _db.Orders.Where(p => p.ProductId == productId)
                     .SelectMany(t1 => _db.Users.Where(x => x.Id == t1.UserId)
                     .DefaultIfEmpty(), (order, user) => user);            
}

Ответы [ 2 ]

0 голосов
/ 03 апреля 2012

Код неясен, но похоже, что вы пытаетесь использовать LINQ2SQL, как если бы вы использовали SQL, а не полагались на LINQ2SQL, чтобы выполнять объединения за вас.Основная путаница здесь заключается в методе GetUsers, который, как я подозреваю, должен возвращать пользователей для данного заказа по указанному идентификатору продукта.Если я правильно понимаю, этот метод должен выглядеть примерно так:

public IQueryable<User> GetUsers(int productId)
{
    IQueryable<User> users = from order in _db.Orders
                             where order.ProductId == productId
                             select order.users;
    return users;
}

Чтобы это работало, у вас должны быть определенные табличные отношения в вашей базе данных и импортированные в файл DBML вместе со всеми определениями таблиц.Определить отношения в БД (т.е. внутри LINQ2SQL) гораздо лучше, чем указывать их в коде каждый раз, когда вы выполняете запрос.Ваши LINQ-запросы будут намного проще.И это помогает сохранить целостность данных базы данных.

0 голосов
/ 03 апреля 2012

Что-то не так с вашей функцией.SelectMany вернет ноль, если нет пользователя, потому что вы используете DefaultIfEmpty().Это означает, что вы хотите сделать left join.Но функция возврата пользователей.Так что это может быть способ для вас:

public IQueryable<User> GetUsers(int productId)
{
    return (
        from o in _db.Orders
        from u in _db.User.Where(a=>a.Id==o.UserId).DefaultIfEmpty()
        where o.ProductId==productId
        select u
    );
}

Я бы ожидал, что функция будет возвращать пользователя при вызове GetUsers.Тогда что-то вроде этого:

public IQueryable<User> GetUsers(int productId)
{
     return (
        from o in _db.Orders
        join u in _db.User
            on o.UserId equals u.Id 
        where o.ProductId==productId
        select u
    );
}

Или, если заказы - это таблица один-ко-многим, и вам нужны уникальные пользователи.Тогда что-то вроде этого:

public IQueryable<User> GetUsers(int productId)
{
    return (
        from o in _db.Orders
        where _db.Users.Select(a=>a.Id).Contains(o.UserId)
        where o.ProductId==productId
        select u
    );
}

Я не совсем уверен, что вы хотите.Но я надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...