【问题标题】:Linq from C# to VB.net从 C# 到 VB.net 的 Linq
【发布时间】:2016-08-08 15:05:46
【问题描述】:

我正在从 C# 尝试这个 LINQ 表达式,但它似乎不起作用

C#

var v = (from a in dc.ChatPrivateMessageMasters
                     join b in dc.ChatPrivateMessageDetails on a.EmailID equals b.MasterEmailID into cc
                     from c in cc
                     where (c.MasterEmailID.Equals(fromid) && c.ChatToEmailID.Equals(toid)) || (c.MasterEmailID.Equals(toid) && c.ChatToEmailID.Equals(fromid))
                     orderby c.ID descending
                     select new
                     {
                         UserName = a.UserName,
                         Message = c.Message,
                         ID = c.ID
                     }).Take(take).ToList();

VB

Dim v = (From a In dc.ChatPrivateMessageMasters _
Join b In dc.ChatPrivateMessageDetails On a.EmailID Equals b.MasterEmailID _
Into cc _
From c In cc Where (c.MasterEmailID.Equals(fromid) AndAlso c.ChatToEmailID.Equals(toid)) OrElse (c.MasterEmailID.Equals(toid) AndAlso c.ChatToEmailID.Equals(fromid)) _
Order By c.ID Descending _
Select New With { _
    .UserName = a.UserName, _
    .Message = c.Message, _
   .ID = c.ID _
}).Take(take).ToList()

我收到来自 'Into' 的错误消息:')' 预期

有什么想法吗?

// 更新我的数据库结构

【问题讨论】:

  • 你试过这个code converter吗?
  • 可以,但没用
  • 您是否了解原始into 子句的意图是什么?在 Visual Basic 中,INTO 与聚合一起使用,而不仅仅是包装先前的查询。

标签: c# vb.net linq c#-to-vb.net


【解决方案1】:

对于初学者,您不需要组加入(join 子句的into 部分),考虑到您立即将其展平(例如,不要进行左外连接)。

您的 C# 查询可以是:

var query =
    (from m in dc.ChatPrivateMessageMasters
    join d in dc.ChatPrivateMessageDetails on m.EmailID equals d.MasterEmailID
    where (d.MasterEmailID == fromid && d.ChatToEmailID == toid)
       || (d.MasterEmailID == toid && d.ChatToEmailID == fromid)
    orderby d.ID descending
    select new
    {
        m.UserName,
        d.Message,
        d.ID
    }).Take(take).ToList();

VB.net 相当于:

Dim query =
    (From m In dc.ChatPrivateMessageMasters
    Join d In dc.ChatPrivateMessageDetails On m.EmailID Equals d.MasterEmailID
    Where (d.MasterEmailID = fromid AndAlso d.ChatToEmailID = toid)
    OrElse (d.MasterEmailID = toid AndAlso d.ChatToEmailID = fromid)
    Order By d.ID Descending
    Select m.UserName, d.Message, d.ID
    Take take).ToList

【讨论】:

  • 代码可以进一步“简化”; Take 子句存在于 VB.Net 的查询语法中,(From ...).ToList 可以重写为 Aggregate ... Into ToList 消除所有括号(即使在 Where 中的括号也不需要,因为 AndAlso 优先于 OrElse)
  • 谢谢杰夫,我试试
  • @Sehnsucht:感谢您提供有关其他条款的提示。特别是,我不知道Take 可用。我不确定如何将Aggregate 集成到其中,所以最后我坚持使用ToList 调用。我同意Where 子句上的额外括号,但对某些人来说,它使它更具可读性,如果其他人认为它会有所帮助,我不会将其从翻译中删除。
  • @JeffMercado 我同意这个条件,这就是为什么我只提到信息(把它放在括号内)。至于子句,几乎(如果不是全部)所有子句都可用于 VB.Net 的查询语法(Skip [While] / Take [While],Distinct)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2010-11-05
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
相关资源
最近更新 更多