【问题标题】:Help with linq to sql query帮助 linq to sql 查询
【发布时间】:2011-02-21 23:35:00
【问题描述】:

根据下表

Sample
Id     Name
---------------
S1     SomeName
S2     OtherName
S3     AnotherName

AlreadyUsed
Id
---------
S2

Reference
Id    FkId
---------
T1    S1
T2    S1

我想实现以下 “仅从样本表中选择那些在 AlreadyUsed 中没有条目并且在其中至少有一个条目的条目 参考表。”

我能够为第一部分编写查询,但对后半部分感到困惑。下面是我可以想出的“仅从样本表中选择那些在 AlreadyUsed 表中没有条目的条目”

var count = 50;

var alreayUsed = from au in repository.GetEntity<AlreadyUsed>() 
                 select au.Id;

var notUsed = (from nu in repository.GetEntity<Sample>()
              where !alreadyUsed.Contains(nu.Id)
              orderby nu.Name
              select new CustomClass
              {
                 CName = nu.Name,
                 CId = nu.Id
              }).Take(count).ToArray();

也请。建议是否有更好的方法来编写上述查询。

谢谢。

【问题讨论】:

  • 表名是"Sample"还是"NotUsed"
  • 您使用了“NotUsed”实体,但 NotUsed 真的是“Sample”吗?

标签: c# linq linq-to-sql c#-4.0


【解决方案1】:
var count = 50;

var alreayUsed = from au in repository.GetEntity<AlreadyUsed>() 
                 select au.Id;

var notUsed = (from nu in repository.GetEntity<Sample>()
              where !alreadyUsed.Contains(nu.Id) && nu.References.Count() > 0
              orderby nu.Name
              select new CustomClass
              {
                 CName = nu.Name,
                 CId = nu.Id
              }).Take(count).ToArray();

请注意,我添加了“nu.References.Count() > 0”

我假设您在数据模型中正确设置了名为 References 的关联关系,以便每个 Sample 对象都有许多“Reference”对象。

【讨论】:

    【解决方案2】:

    这应该可以实现您想要的。当然,有很多方法可以做到。我个人会这样写。

    var items = (from r in repository.GetEntity<Reference>()
                 join s in repository.GetEntity<Sample>()
                     on r.FkId equals s.Id
                 where !repository.GetEntity<AlreadyUsed>().Contains(s.Id)
                 orderby s.Name
                 select new CustomClass
                 {
                     CName = s.Name,
                     CId = s.Id
                 })
                .Take(count)
                .ToArray();
    

    【讨论】:

      【解决方案3】:

      您应该能够使用您已经使用的示例中的相同技术。例如:

      var reference = from r in repository.GetEntity<Reference>()
                      select r.Id;
      
      var notUsed = (from nu in repository.GetEntity<Sample>()
                     where !alreadyUsed.Contains(nu.Id)
                     && reference.Contains(nu.Id)
                     select new CustomClass
                     {
                         CName = nu.Name,
                         CId = nu.Id
                     }).Take(count).ToArray();
      

      但是,如果您确实在 Sample 表和 Reference 表之间建立了关联,那么您可能应该使用 Paul 的方法。

      【讨论】:

      • 您应该选择r.FkId 进行参考查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多