【问题标题】:Linq query to return different types of collections conditioanllyLinq 查询有条件地返回不同类型的集合
【发布时间】:2017-08-16 14:19:09
【问题描述】:

使用 Linq 恢复不同类型集合的最佳方法是什么。 我有包含不同类型聊天消息的聊天表:

  • 纯文本
  • 图片
  • 视频

表格的列是:

  • 身份证
  • senderId(发送聊天消息的人)
  • 字符串(用于文本聊天消息)
  • 图片/视频网址(用于图片或视频网址)
  • 类型(1 用于文本,2 用于图像,3 用于视频)
  • created_date(添加聊天的日期时间)

我正在从视图模型返回该信息:

var query = _context.Chats.Select(c => new ChatViewModel {
  // 
});

当用户发送视频消息时,我希望有更多信息可以带回来(视频第一帧图像的 url,以秒为单位的长度)。

我不知道如何以及在哪里存放这些额外的视频信息?当行是视频时,我可以专门添加 2 个 Nullable 额外列,但正如您所知,这是一个非常丑陋的选择。

或者我可以为这 2 列添加一个全新的表,但是当该行是视频类型时,我将如何有条件地加入该表? 我是否对该表进行左外连接(链式语法 Linq 中的交叉连接)?如果我还决定将图像额外信息移动到它自己的表中,那也会是其他左外连接吗?

this link 建议使用基类来产生如下效果:

IQueryable<BasePeople> basePeople;
if (teamType == "A")
   basePeople = context.PeopleExtendedInfoA;
else
   basePeople = context.PeopleExtendedInfoB;

然后加入该基类,但在该示例中 PeopleExtendedInfoA 和 PeopleExtendedInfoB 属于同一类型,而我的视频类型与其他两种类型(文本和图像)不同。

请注意:从服务器返回行时,必须考虑返回聊天的创建日期顺序。

你有什么建议?

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    我的第一反应是将 URL 和持续时间作为子表返回。如果消息不是视频消息,则子表中将没有行。

    【讨论】:

    • 感谢您抽出宝贵的时间。您将如何有条件地将其在 linq 中写入该视频子表?如果我也决定有图像子表怎么办?
    • 我认为 Brian 是对的,如果您需要一个用于存储图像数据的表格,那么......您可以添加它。一个简单的LEFT JOIN 或构建视图模型时的单独查询。
    • 恐怕我无法使用实际的 LINQ 语法 - 除了一些 非常 简单的教程之外,我从未使用过它。我的回答完全基于数据库设计原则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2011-08-20
    相关资源
    最近更新 更多