【问题标题】:Select "IN" in LINQ to SQL在 LINQ to SQL 中选择“IN”
【发布时间】:2011-03-28 11:01:59
【问题描述】:

我得到一个要更新的实体列表,并且我有它们的 ID。我想从数据库中获取原始的,所以我这样做了:

String[] ids = updatedEvents.Select(ue => ue.id).ToArray();

var originalEventsToUpdate = Db.tbl_ffk_event
                               .Where(e => ids.Contains(e.id))
                               .ToArray();

但是我使用日志得到的是这个生成的 SQL:

SELECT [t0].[id], [t0].[fs_mapping_id], [t0].[fs_id_value], [t0].[desc]
FROM [dbo].[tbl_ffk_event] AS [t0]
WHERE 0 = 1
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

而那个 SQL 的意思是“获取整个表”。

如何生成这样的“IN”:

SELECT [t0].[id], [t0].[fs_mapping_id], [t0].[fs_id_value], [t0].[desc]
FROM [dbo].[tbl_ffk_event] AS [t0]
WHERE [t0].[id] IN ('aaa','bbb','ccc','ddd','eee',)

提前致谢。

编辑:

我觉得自己很蠢,我没有看到WHERE 0 = 1。这是因为在那时,ids 集合中没有任何内容。我现在检查了确保有项目,并且正确生成了 SQL。对不起。

【问题讨论】:

  • 您说,“SQL 的意思是'获取整个表'。”我想你的意思是,“一无所获”。那个 WHERE 子句总是错误的。
  • 你的身份证真的是字符串吗?
  • 我以为它说的是 'WHERE 1 = 1' 我没有意识到这一点。
  • vtortola,我不会对那个感到愚蠢,因为 SQL 的格式(虽然它必须做的事情是正确的)有点出乎意料。不过,考虑到WHERE [t0].[id] IN () 将是无效的,我想这是足够明智的SQL。聪明的 linq ;)

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


【解决方案1】:

实际上,由于 WHERE 0 = 1 子句,此 SQL 将返回一个空记录集(即根据架构正确映射,但没有行)。

您提供的代码似乎是正确的,但有些东西使查询提供者确信永远不会有匹配的行。

假设这不正确,我会查看id 属性的列映射。是否正确匹配数据库?

【讨论】:

  • 我以为它说的是 'WHERE 1 = 1' 我没有意识到这一点。
  • 映射怎么样,它是否揭示了我怀疑的问题(如果没有,也许将它添加到您的问题中)。
【解决方案2】:

可能你的列表是空的,这是 Linq 的正常行为。

【讨论】:

    【解决方案3】:

    试试这个:

    Dim strval As String = ""
    Dim strnum(30) As String
    
    strval = "1,2,3,4,5,6,7,9"
    
    strnum = strval.split(",")
    
    originalEventsToUpdate = (from a in Db.tbl_ffk_event where strnum.contains(a.id) select a).tolist
    

    【讨论】:

    • 仅供参考:此代码是 VB.NET,而不是问题中的 C#。 (VB 有 LINQ 吗?我真的不知道。)
    • 我认为他们在星期二将 LINQ 添加到 vb
    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2011-09-13
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多