6

我在 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(),即只有当他们有一个兴趣并且是足球时才会返回,如果他们有两个并且其中一个不是足球,则不会返回任何内容。

有人有什么想法吗?

4

5 回答 5

7

尝试这个,

var result = from c in ctx.Customer
             from i in c.Interest
             where i.InterestName == "Football"
             select c;

希望这可以帮助,

射线。

于 2009-07-26T03:33:15.573 回答
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);
}
于 2009-04-27T14:23:26.890 回答
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;
于 2010-10-15T16:00:12.407 回答
1

如果你试图保持它的通用性,更好的方法是使用实​​体 sql[Esql]。Coz L2E 不支持 linq 查询中的集合位置。

你不能使用

customer.Interests.Where(interest => interest.Name =='FootBall')

查询看起来像这样..

context.CreateQuery(@"SELECT VALUE Customer FROM Customer WHERE EXISTS( SELECT VALUE FROM CustomerInterest WHERE CustomerInterest.Ineterest.Name = 'FootBall')).Include("Interest");

希望能帮助到你!

于 2009-05-04T17:51:24.537 回答
0

这对 LINQT 来说太多了。尝试在您的数据库中使用视图或按照 Deepak N 所说的那样工作。最好的

于 2009-06-16T04:20:45.683 回答