Linq to Sql没有支持的SQL转换

时间:2012-04-03 08:51:00

标签: linq-to-sql

我在下面的行中得到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 :(得分:0)

你的功能有些不对劲。如果您没有使用SelectMany用户,则DefaultIfEmpty()将返回null。这表明您想要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
    );
}

我不确定你想要什么。但我希望这会有所帮助

答案 1 :(得分:0)

代码不清楚,但看起来你正在尝试使用LINQ2SQL,就像使用SQL而不是依靠LINQ2SQL为你做连接一样。这里主要的混淆是GetUsers方法,我怀疑应该在给定的产品ID上返回给定订单的用户。如果我说得对,这个方法应该更像这样:

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

为此,您必须在数据库中定义表关系,并将其与所有表定义一起导入DBML文件。在DB中定义关系(因此在LINQ2SQL中)是比每次执行查询时在代码中指定关系更好的方法。您的LINQ查询将更加简单。它有助于保持数据库数据的完整性。