sql—如何使用distinct选项筛选与不同外键相关的列名值c#.net lambda linq网络

fkvaft9z  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(420)

我有一个名为campaign的表,它有一个名为snapshot的表中的外键。
我想从表campaigns和每个外键(snapshotid)中获取记录,以按列campaigname对它们进行区分。因此,在外键snapshotid中,我想使用datasetid,然后通过campaigname进行区分。
如果我使用distinctby而不是distinct,如果一个campaigname属于不同的外键,它将在所有情况下对它们进行区分。但是,我想区分对应于相同datasetid的campaigname的值
最后,作为一个结果,我正在尝试:我有一个名为upstream的campaigname,它属于外键(snapshotid)1、2和5。snapshotid 1和2对应于计划,5对应于生产。所以,我想带上所有记录,并过滤每个datasetid的活动名称。所以上游应该来两次。与生产和计划有关的一个。然而,在规划的上游,它将被区分,因为它存在两次。
快照表

市场活动表

作为例子:我试过了

  1. var campaigns = db.Campaigns.Include(c => c.Snapshot)
  2. .OrderBy(i => i.Snapshot.DatasetID)
  3. .ThenBy(i => i.CampaignName.Distinct());

上面的一个抛出了一个exception=>dbdistinctexpression需要一个collection参数。参数名称:参数

  1. var campaigns = db.Campaigns.Include(c => c.Snapshot)
  2. .GroupBy(i => i.Snapshot.DatasetID)
  3. .Select(i => i.CampaignName.Distinct());

上面没有这么编译,我试过很多组合但也没用。
如果可能的话,我想帮助使查询主要写在lambda中,然后同样的查询写在linq中

q7solyqu

q7solyqu1#

我用类来模拟你的数据库以显示正确的语法。必须检查创建日期是否介于开始日期和结束日期之间。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data;
  6. namespace ConsoleApplication11
  7. {
  8. class Program
  9. {
  10. const string FILENAME = @"c:\temp\test.txt";
  11. static void Main(string[] args)
  12. {
  13. DataBase db = new DataBase()
  14. {
  15. Snapshot = new List<Snapshot>() {
  16. new Snapshot() { Id = 1, CreationDate = new DateTime(2019, 10, 1, 8,0,0), DatasetID = "Planning"},
  17. new Snapshot() { Id = 2, CreationDate = new DateTime(2019, 10, 2, 8,0,0), DatasetID = "Planning"},
  18. new Snapshot() { Id = 3, CreationDate = new DateTime(2019, 10, 15, 13,0,0), DatasetID = "Production"},
  19. new Snapshot() { Id = 4, CreationDate = new DateTime(2019, 10, 16, 14,0,0), DatasetID = "Production"},
  20. new Snapshot() { Id = 5, CreationDate = new DateTime(2019, 10, 16, 17,0,0), DatasetID = "Production"}
  21. },
  22. Campaign = new List<Campaign>() {
  23. new Campaign() { Id = 1, CampaignName = "Upstream", StartDate = new DateTime(2019, 11, 1, 8,0,0), EndDate = new DateTime(2019, 11, 2, 17,0,0), SnapshotID = 1},
  24. new Campaign() { Id = 2, CampaignName = "Downstream", StartDate = new DateTime(2019, 11, 3, 8,0,0), EndDate = new DateTime(2019, 11, 6, 15,0,0), SnapshotID = 2},
  25. new Campaign() { Id = 3, CampaignName = "Upstream", StartDate = new DateTime(2019, 11, 1, 10,0,0), EndDate = new DateTime(2019, 11, 2, 18,0,0), SnapshotID = 2},
  26. new Campaign() { Id = 4, CampaignName = "BufferPrep", StartDate = new DateTime(2019, 12, 1, 6,0,0), EndDate = new DateTime(2019, 12, 5, 15,0,0), SnapshotID = 3},
  27. new Campaign() { Id = 5, CampaignName = "Product1", StartDate = new DateTime(2019, 12, 6, 8,0,0), EndDate = new DateTime(2019, 12, 7, 19,0,0), SnapshotID = 4},
  28. new Campaign() { Id = 6, CampaignName = "Product2", StartDate = new DateTime(2019, 12, 8, 8,0,0), EndDate = new DateTime(2019, 12, 9, 20,0,0), SnapshotID = 5},
  29. new Campaign() { Id = 7, CampaignName = "BufferPrep", StartDate = new DateTime(2019, 12, 1, 12,0,0), EndDate = new DateTime(2019, 12, 6, 10,0,0), SnapshotID = 5},
  30. new Campaign() { Id = 9, CampaignName = "Upstream", StartDate = new DateTime(2019, 11, 5, 0,0,0), EndDate = new DateTime(2019, 11, 9, 0,0,0), SnapshotID = 5}
  31. }
  32. };
  33. var groups = (from s in db.Snapshot
  34. join c in db.Campaign on s.Id equals c.SnapshotID
  35. select new { snapshot = s, campaign = c }
  36. )
  37. .GroupBy(x => x.snapshot.Id)
  38. .ToList();
  39. var results = groups.Select(x => new
  40. {
  41. snapshot = x.First().snapshot,
  42. campaign = x.GroupBy(y => y.campaign.CampaignName).Select(y => y.First().campaign).ToList()
  43. }).ToList();
  44. }
  45. }
  46. public class DataBase
  47. {
  48. public List<Snapshot> Snapshot { get; set; }
  49. public List<Campaign> Campaign { get; set; }
  50. }
  51. public class Snapshot
  52. {
  53. public int Id { get; set; }
  54. public DateTime CreationDate { get; set; }
  55. public string DatasetID { get; set; }
  56. }
  57. public class Campaign
  58. {
  59. public int Id { get; set; }
  60. public string CampaignName { get; set; }
  61. public DateTime StartDate { get; set; }
  62. public DateTime EndDate { get; set; }
  63. public int SnapshotID { get; set; }
  64. }
  65. }
展开查看全部
qpgpyjmq

qpgpyjmq2#

初始结果无明显差异
我配置了查询: var campaigns = db.Campaigns.Include(c => c.Snapshot) .GroupBy(i => i.Snapshot.DatasetID).AsEnumerable() .SelectMany(i =>i.DistinctBy(z=>z.CampaignName)); 这是我想要的,但这次不显示datasetid新结果的值
这次,如何显示datasetid值?
这是view.cshtml

相关问题