Entity Framework 多对多查询不会写

dsclub 2012-07-16 08:18:35



现在要找出价格小于80的所有的订过的客户名称:
SELECT Orders.UserName
FROM OrderLine LEFT OUTER JOIN
Orders ON OrderLine.OrderID = Orders.OrderID LEFT OUTER JOIN
Products ON OrderLine.ProductID = Products.ProductID
WHERE (Products.Price < 80)

但是怎么写entity 查询呢?

var query = en.Products.Where(p=>p.Price < 80) ?? 后面怎么接啊?
...全文
533 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsclub 2012-07-18
  • 打赏
  • 举报
回复
没有满意答案,但是终于自己解决了,不知道是不是我个人表述的不清楚还是怎么的,我实在不太熟悉EF,但是啃了2天文档,发现有个SelectMany方法就把这个问题给解决了。

至此,我坚持认为:
1、既然选择使用ORM就要抛开数据库编程,所以不应该为了达到BLL层的要求而硬性去做存储过程,这样实在不合理,尤其是协同开发。
2、计算机硬件速度提升的再牛B,也仍然要坚持范式设计理论。M-2-M肯定要使用到中间表来维系两端M的关系,但是不应该再给中间关系表上加一个PK来维持。
3、要深入了解ORM,要深入了解OO。如果在此示例中中间表加入了PK:OrderlineID,那么再映射出来的导航属性没有ICollection<T>了。(此点我个人不是很肯定,我不会Code-First,是Database-first的自动出现的edmx)。

无论如何还是把分数散了吧,谢谢各位同仁的关注!
q107770540 2012-07-18
  • 打赏
  • 举报
回复
楼主可以将SelectMany的解决方法帖出来看看
宝_爸 2012-07-17
  • 打赏
  • 举报
回复
多对多肯定要用中间表的。
宝_爸 2012-07-17
  • 打赏
  • 举报
回复
最好还是有一个OrderLineID,作为Primary Key吧。
dsclub 2012-07-16
  • 打赏
  • 举报
回复

var teacher = db.Teachers.Add(new Teacher { Name = "Scott", Birthday = DateTime.Now, Sex = true });

for (int i = 1; i <= 10; i++)
{
var s = new Student { Name = "Echo·" + (char)(i + 64), Birthday = DateTime.Now, Sex = i % 2 == 1 };
teacher.Students.Add(s);
}

db.SaveChanges();

dsclub 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

视图,存储过程。EF都支持导入。

你这个查询是不是有关系?

order,product与orderitems(你的orderline)都是左链接?

那也就意味着,用户下的订单里有可能出现一件你网站上根本就不存在的商品。
这样的数据完整吗?
[/Quote]

呵呵,真仔细,我现在是测试数据,为了看到效果使用的左连接,您说的非常对!

我现在想用EF来做这个事情,但是怎么都不会弄~~
a157147899 2012-07-16
  • 打赏
  • 举报
回复
视图,存储过程。EF都支持导入。

你这个查询是不是有关系?

order,product与orderitems(你的orderline)都是左链接?

那也就意味着,用户下的订单里有可能出现一件你网站上根本就不存在的商品。
这样的数据完整吗?
dsclub 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

Orderline 不要使用联合主键
用这样的结构:
Id <PK>
ProductID <FK>
OrderID <FK>

C# code

var query=from ol in OrderLine
join o in Orders
on ol.OrderID equals o.OrderID into left1
……
[/Quote]

如果OrderLine不使用主键联合那么就是造成了数据冗余啊?

我觉得不应该为了使用EF而弄出一个多余的列出来吧?

还是说在EF下,这种情况无解?

那,可不可以在数据库中做好View,然后用EF来对View操作,或存储过程?
EF实在刚刚接触……
dsclub 2012-07-16
  • 打赏
  • 举报
回复
映射出OrderLine的结果就是多出一列Id么?

用这样的结构:
Id <PK>
ProductID <FK>
OrderID <FK>

但是总是关机这样的结构不合理……最起码感觉不是符合数据库设计要求的。
dsclub 2012-07-16
  • 打赏
  • 举报
回复
如果OrderLine不使用主键联合那么就是造成了数据冗余啊?

我觉得不应该为了使用EF而弄出一个多余的列出来吧?

还是说在EF下,这种情况无解?
宝_爸 2012-07-16
  • 打赏
  • 举报
回复
下面的代码OrderItems相当于你的OrderLine. Where你可以自行修改。

OrderItems 也被映射进来了。


var query = from oi in context.OrderItems
join o in context.Orders on oi.OrderId equals o.OrderId
join p in context.Products on oi.ProductId equals p.ProductId
where p.ProductId == 310
select o;
q107770540 2012-07-16
  • 打赏
  • 举报
回复
Orderline 不要使用联合主键
用这样的结构:
Id <PK>
ProductID <FK>
OrderID <FK>


var query=from ol in OrderLine
join o in Orders
on ol.OrderID equals o.OrderID into left1
from o in left1.DefalutIfEmpty()
join p in Products
on ol.ProductID equlas p.ProductID into left2
from p in left2.DefalutIfEmpty()
where p.price<80
select o==null?"":o.UserName;
timfeng2009 2012-07-16
  • 打赏
  • 举报
回复

var query=from u in en.Products select u.OrderLine.Orders.UserName
宝_爸 2012-07-16
  • 打赏
  • 举报
回复
我觉得Orderline也要映射吧。
dsclub 2012-07-16
  • 打赏
  • 举报
回复
使用存储过程倒是能够很好的解决这个问题了,不用多增加一列OrderLineID了,但是,我突然意识到一个问题,如果我还是要做存储过程的话,那么我选择ORM还做什么呢?使用ORM不就是为了排除和数据库上的交流么?

如果为了实现对多对的查询,而要牺牲空间这有悖数据库设计理论!
如果为了在不违背数据库冗余设计的前提下使用存储过程来提供ORM查询,这又违背了ORM的初衷!

是EF还不够强大?还是,我真的在一个没用的问题上纠结进了死胡同?

8,494

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧