【问题标题】:Need a subquery in LINQ需要 LINQ 中的子查询
【发布时间】:2014-05-05 14:21:55
【问题描述】:

我想选择此表中的所有项目:

_categoryRepository.Table :

Id  Name

1   Birthday
2   Christmas
4   Desktops
6   Notebooks
7   Accessories
9   Cell phones

但是,. .我想从 _categoryRepository 中排除与此表中的“EventID”匹配的任何“Id”:

_MemberEventRepository.Table

Id  MemID   EventID

1   1   1
3   1   2
5   1   7
7   4   1
8   4   4

与 MemId 匹配。所以对于 MemID '1',结果将是:

4   Desktops
6   Notebooks
9   Cell phones

我不知道如何在 LINQ 中执行此操作。

    var eventsList = from c in _categoryRepository.Table
                    join m in _MemberEventRepository.Table on ?????????????
                    where (m.MemID == currentCustomer)         
                    orderby c.Name
                    select new MyActiveEvents { Id = c.Id, Name = c.Name };

这相当于 SQL:

SELECT [Id] ,[Name]
FROM [Category] 
WHERE Id NOT IN 
(SELECT EventID FROM [Category] c INNER JOIN [MemberEvent] m ON m.[EventID] = c.Id)

这在 LINQ 中可行吗?

【问题讨论】:

  • 您使用的是LINQ-to-sql 还是LINQ-to-entities?看起来更像LINQ-to-sql,但在LINQ-to-entites 的情况下:是否定义了实体关系,例如Category 是否有 Events 导航属性?
  • "类别是否有事件导航属性?"不。不能同时使用 LINQ-to-sql 或 LINQ-to-entities 吗?
  • 理论上它们可以并行使用,但我对LINQ-to-sql不是很熟悉,因为我通常只使用LINQ-to-entities...

标签: c# .net linq asp.net-mvc-4 linq-to-sql


【解决方案1】:

应该是这样的:

var categories = db.Categories
                   .Where(c => db.MemberEvents.Count(e => EventID == c.Id) == 0);

更新 - 使用您的 LINQ 代码片段:

var eventsList = from c in _categoryRepository.Table
                 where _MemberEventRepository.Table
                     .Count(m => m.EventID == c.id) == 0       
                 orderby c.Name
                 select new MyActiveEvents { Id = c.Id, Name = c.Name }

除了Count(...) == 0,也应该可以使用!Any(...)

【讨论】:

  • 相当不错的chrfin。工作完美。这么几行就可以了。我希望我更了解 LINQ。谢谢
【解决方案2】:

也许例外会起作用?我不确定哪种解决方案会转化为最有效的 sql。

var eventsList = (from c in _categoryRepository.Table
                  orderby c.Name
                  select new MyActiveEvents { Id = c.Id, Name = c.Name })
                 .Except(
                from c in _categoryRepository.Table
                join m in _MemberEventRepository.Table on c.Id equals m.EventID
                where (m.MemID == currentCustomer)         
                select new MyActiveEvents { Id = c.Id, Name = c.Name });

【讨论】:

  • "哪种解决方案将转化为最有效的 sql" 。 .我更关心在这一点上完成工作。两种解决方案都有效。我更了解你的,但想了解更多 LINQ,因为我相信它最终会让事情变得更容易。谢谢
猜你喜欢
  • 2017-11-23
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多