【问题标题】:LINQ with joins and a List<GUID>带有连接和 List<GUID> 的 LINQ
【发布时间】:2010-11-23 13:39:55
【问题描述】:

这是我用来制作 LINQ 语句原型的 SQL。代码中的 GUID 是 List&lt;GUID&gt;。我试了 3 个小时,就是不明白。可以在睡梦中编写 LINQ 的好心人帮帮我。

SELECT DISTINCT  [id]
      ,[emailAddress]
      ,[name]
      ,[emailRunNumber]
  FROM [emailAddress]
  join promotionsJoin
  on promotionsJoin.EmailAddressId = emailAddress.id
  where promotionsJoin.promotionId in ('09464b57-f3d7-41ec-b0b1-cbc5999824bd',
  '8bc855b2-2f01-4083-b43a-dab7b7a81ac8') AND emailRunNumber is NULL

【问题讨论】:

    标签: .net linq entity-framework join linq-to-entities


    【解决方案1】:
    (from emailAddress in emailAddresses
     join promotion in promotions 
       on emailAddress.id equals promotion.EmailAddressId
     where guidsList.Contains(promotion.promotionId)
        && promotion.emailRunNumber == null
     select new {
         emailAddress.id,
         emailAddress.emailAddress,
         promotion.name,
         promotion.emailRunNumber
    }).Distinct()
    

    如果您的映射中的两个表之间已经存在关系,则此处的联接将是不必要的(那么promotion 将只是emailAddress 之外的一个字段)

    【讨论】:

    • 这似乎很接近......促销没有emailAddressId,但正如克劳斯指出的那样有PromotionJoin。 (今天是假期……明天我会在 LINQPad 中解决这个问题并发布我的发现)谢谢 bdukes!
    【解决方案2】:

    扩展@Klaus 的回答:

    var result = YourObjectContext.EmailAddress
        .Where(ea =>
            ea.emailRunNumber == null &&
            new[]
            {
                new Guid("09464b57-f3d7-41ec-b0b1-cbc5999824bd"),
                new Guid("8bc855b2-2f01-4083-b43a-dab7b7a81ac8"
            }.Contains(ea.PromotionJoin.promotionId))
        .Distinct();
    

    var result = YourObjectContext.EmailAddress
        .Where(ea =>
            ea.emailRunNumber == null &&
            new[]
            {
                "09464b57-f3d7-41ec-b0b1-cbc5999824bd",
                "8bc855b2-2f01-4083-b43a-dab7b7a81ac8"
            }.Select(s => new Guid(s)).Contains(ea.PromotionJoin.promotionId));
        .Distinct();
    

    【讨论】:

    • 我开始明白为什么学习 LINQ 会有点困难……有很多方法可以完成这项工作。正如我在上面对克劳斯的回应中提到的,我很抱歉不清楚。我有一个 List 但是今天是假期,所以明天我会在你们好心人提供的帮助下解决这个问题并发布我的发现。谢谢,Abatishchev!
    • @George:很高兴为您提供帮助!详细描述您的问题,我会尽力为您提供帮助:)
    【解决方案3】:

    linq-to-entities 不支持in 运算符,但您可以这样做。

    var result = YourObjectContext.EmailAddress
                    .Where(ea => ea.emailRunNumber == null 
                    && (ea.PromotionJoin.promotionId == new Guid("09464b57-f3d7-41ec-b0b1-cbc5999824bd") || 
                        ea.PromotionJoin.promotionId == new Guid("8bc855b2-2f01-4083-b43a-dab7b7a81ac8"));
    

    如果您的PromotionJoin 表具有对EmailAddress 主键的外键引用,则名为EmailAddress 的EF 生成类将自动具有一个名为PromotionJoin 的字段。

    【讨论】:

    • @abatischev,哎呀,从问题复制时忘记更改。
    • 克劳斯,对不起,我在原始帖子中并不清楚。我在代码中有一个 List,但在 SQL 中对其进行了原型化,但是我认为使用 PromotionJoin 的线索会对我有所帮助. (今天是假期,我明天会在 LINQPad 中解决这个问题并发布我的发现)
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多