我在查询Linq To Entities中的多对多关系时遇到问题。 我基本上试图使用Linq复制此查询:
Select *
FROM Customer
LEFT JOIN CustomerInterest ON Customer.CustomerID = CustomerInterest.CustomerID
LEFT JOIN Interest ON CustomerInterest.InterestID = Interest.InterestID
WHERE Interest.InterestName = 'Football'
我环顾网络并没有找到任何合适的例子来说明这一点。我最接近的是:
List<Customer> _Customers = (from _LCustomers in _CRM.Customer.Include("CustomerInterest.Interest")
where _LCustomers.CustomerInterest.Any(x => x.Interest.InterestName == "Football")
select _LCustomers).ToList();
问题在于,如果客户有多个兴趣,其中一个是“足球”,则返回所有这些兴趣。我也看过All()有逆问题,即只有他们有一个兴趣才会返回,而且只有足球,如果他们有两个,而其中一个不是足球,则不会返回。
有人有任何想法吗?
答案 0 :(得分:7)
试试这个,
var result = from c in ctx.Customer
from i in c.Interest
where i.InterestName == "Football"
select c;
希望这有帮助,
雷
答案 1 :(得分:3)
我不确定你想要获得什么。具有客户兴趣和兴趣的客户列表?只需按客户兴趣开始查询。
context.CustomerInterest.
Where(ci => ci.Interest.InterestName == "Football").
Select(ci => new
{
Customer = ci.Customer,
CustomerInterest = ci,
Interest = ci.Interest
});
但这是多余的。为什么不只是获得匹配的客户利益?
IEnumerable<CustomerInterest> customerInterests = context.CustomerInterest.
Where(ci => ci.Interest.InterestName == "Football");
您仍然可以访问其他信息,而无需明确存储。
foreach (CustomerInterest customerInterest in customerInterests)
{
DoSomething(customerInterest);
DoSomething(customerInterest.Customer);
DoSomething(customerInterest.Interest);
}
答案 2 :(得分:2)
var results = from c in _CRM.Customer
from ci in c.Interests
join i in _CRM.Interests
on ci.ID equals i.ID
where i.Interest = "Football"
select c;
答案 3 :(得分:1)
如果你试图保持通用,更好的方法是使用实体sql [Esql]。 Coz L2E不支持linq查询中集合的位置。
你不能使用
customer.Interests.Where(interest =&gt; interest.Name =='FootBall')
查询看起来像这样..
context.CreateQuery(@"SELECT VALUE Customer
FROM Customer WHERE EXISTS( SELECT VALUE FROM CustomerInterest WHERE CustomerInterest.Ineterest.Name = 'FootBall')).Include("Interest");
答案 4 :(得分:0)
这对LINQT来说很重要。尝试使用您的数据库中的视图或作为Deepak N说。 最好