【问题标题】:LINQ join on two or more conditions [duplicate]LINQ在两个或多个条件下加入[重复]
【发布时间】:2014-08-03 23:40:04
【问题描述】:

我正在尝试创建一个 linq join 语句,该语句根据两个条件从表中连接一个对象

MESSAGES
======
ID (int)
UserID (Guid)

MESSAGEPART
======
MessageID (int) 
IsPlaintext (bool)
MessageContent (nvarchar(max))

这是我想写的查询,本质上是:

var messages = from m in db.Message 
               join p in db.MessagePart on m.ID equals p.MessageID 
                                        and p.IsPlaintext equals false

很遗憾,这不起作用。这是我能做的最好的。

var messages = from m in db.Message 
               join p in
               (from x in db.MessagePart where x.IsPlaintext == false select x) 
               on m.ID equals p.MessageID

这似乎有点冗长。有没有更优雅的实现方式?

【问题讨论】:

  • 你能把第二个join 条件改为where 吗?
  • 究竟有什么长篇大论?代码中有你不喜欢的特定部分吗?

标签: c# sql linq


【解决方案1】:

你可以试试这个:

var messages = from m in db.Message 
               join p in db.MessagePart 
               on new { m.ID, false } equals { p.MessageID, p.IsPlaintext }

或者你可以试试这个:

var messages = db.Message.Join(db.MessagePart.Where(x=>x.IsPlainText==false),
                               x=>x.ID,
                               y=>y.Id,
                               (x,y)=>new {});

new { } 中,您将声明您选择的匿名类型的属性。

ps。如果您更新您的帖子并在那里显示您想要选择的字段,我也可以更新我的。

【讨论】:

  • 我喜欢你的第一个答案,因为它解决了我前几天遇到的问题,但我认为它生成的 SQL 会很讨厌......
【解决方案2】:

一个优雅的解决方案。

  var messages = from m in db.Message 
                   join p in db.MessagePart on m.ID equals p.MessageID 
                   where p.IsPlaintext == false

【讨论】:

  • +1 这是因为它是 OP 要求的“优雅”,并且还会生成漂亮的 SQL
猜你喜欢
  • 2018-01-30
  • 2011-03-02
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2014-05-14
  • 2015-07-01
  • 1970-01-01
相关资源
最近更新 更多