2009-12-30 107 views
0

好吧,首先,我是LINQ2SQL的全新人物,所以请原谅我的无知。LINQ to SQL - 按条件限制关系(一对多)(1 - M)

我做了一些搜索,但1小时后,我决定来这里。

这里是:

我想要做一些我认为很简单的事情。这可能只是我不明白。我正在使用LINQ 2 SQL,通过VS设计器。我有2个表格:客户和类别。客户可以有多个类别。

我有一个非常简单的查询,寻找客户:

Client c = db.Clients.SingleOrDefault(client => client.ID == id); 

我想要做的就是修改这使得集合:c.Categories,将只包含该客户端的类别的子集。

这是我已经试过:

Client c = db.Categories.Where(cat => cat.IsActive == true).Select(cat.Clients).SingleOrDefault(client => client.ID == id); 

我得到一个错误报告被返回了多个客户端。

  1. 我错过了什么吗?这不是LINQ旨在做的事吗?
  2. 我是否应该使用第一个查询,然后在我需要该列表时在类别上专门做另一个查询?

    c.Categories.Categories.Where(猫=> cat.IsActive ==真)

预先感谢您。

+0

你怎么想限制类别清单的客户端?是否有您希望查看的分类表上的“IsActive(bool)”字段? – 2009-12-30 22:19:17

+0

这正是我想要做的。 – Kevin 2009-12-30 22:50:03

回答

1

SingleOrDefault()适用于只有一个结果的情况。似乎有多个记录具有该ID。尝试使用FirstOrDefault()代替。

Client c = db.Categories.Where(cat => cat.Name == "Name").Select(cat.Clients).FirstOrDefault(client => client.ID == id); 
+0

它编译并运行,但条件(cat.Name ==“Name”)完全被忽略。 – Kevin 2009-12-30 22:16:15

+0

好的,看着你的代码,我实际上对你想要完成的事情感到困惑。你究竟想要做什么?你是否想从数据库中删除记录? – BFree 2009-12-30 22:36:29

+0

我刚刚复制了Marc的评论: 您想如何限制客户端的类别列表?是否有您希望查看的分类表上的“IsActive(bool)”字段? - marc_s 30分钟前 这有意义吗? – Kevin 2009-12-30 22:50:49

1

的问题是Categories.Where部分与Select组合,将返回集合的集合。您可能需要做的是使用SelectMany或使用Single(或SingleOrDefaultFirstFirstOrDefault)而不是Where

例子:

Client c = db.Categories.Where(cat => cat.IsActive) 
         .SelectMany(cat.Clients) 
         .SingleOrDefault(client => client.ID == id); 

Client c = db.Categories.Single(cat => cat.IsActive) 
         .Clients 
         .SingleOrDefault(client => client.ID == id); 
+0

第二个不会工作。我需要使用该名称的所有类别... 可能是名称是一个不好的例子...让我修改我的原始问题 – Kevin 2009-12-30 22:54:56

+0

您仍然犯了错误,您需要SelectMany。 – 2009-12-31 06:17:13