我在下面的行中得到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);
}
答案 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查询将更加简单。它有助于保持数据库数据的完整性。