c# - 设置 DataLoadOptions 时,LINQ 返回错误的项目数

标签 c# sql linq

这是一个代码示例:

MyDataContext context = new MyDataContext();

Symbol symbol = (from s in context.Symbols where s.ID = 3257 select s).First();
ProtocolVariable[] variables = symbol.ProtocolVariables.ToArray();    

context.Dispose();

使用调试器我看到变量的数量等于 3 (variables.Length == 3)。 现在我稍微更改一下代码:

MyDataContext context = new MyDataContext();

DataLoadOptions dlo = new dataLoadOptions();
dlo.LoadWith<Symbol>(s => s.ProtocolVariables);
context.LoadOptions = dlo;

Symbol symbol = (from s in context.Symbols where s.ID = 3257 select s).First();
ProtocolVariable[] variables = symbol.ProtocolVariables.ToArray();    

Context.Dispose();

调试器现在向我显示变量数等于 1。

这怎么可能?

这里补充一些信息(不知道重要不重要):

  • “符号”是一个表格
  • “ProtocolVariables”是一个 View
  • 我使用 *.dbml 文件添加的“符号”和“ProtocolVariables”之间的关联。

这是第一个代码示例背后的 SQL 查询:

SELECT 
[t0].[ID], 
[t0].[SubsystemID], 
[t0].[GenericName], 
[t0].[LocalName], 
[t0].[TypeID], 
[t0].[Array], 
[t0].[Array2], 
[t0].[UnitID], 
[t0].[Description], 
[t0].[ProtocolID]
FROM [dbo].[Symbols] AS [t0]
WHERE [t0].[ID] = 3257

这是第二个代码示例后面的 SQL 查询:

SELECT 
[t0].[ID], 
[t0].[SubsystemID], 
[t0].[GenericName], 
[t0].[LocalName], 
[t0].[TypeID], 
[t0].[Array], 
[t0].[Array2], 
[t0].[UnitID], 
[t0].[Description], 
[t0].[ProtocolID], 
[t1].[ID] AS [ID2], 
[t1].[SymbolID], 
[t1].[SubsystemID] AS [SubsystemID2], 
[t1].[GenericName] AS [GenericName2], 
[t1].[LocalName] AS [LocalName2], 
[t1].[TypeID] AS [TypeID2], 
[t1].[Array] AS [Array3], 
[t1].[Array2] AS [Array22], 
[t1].[UnitID] AS [UnitID2], 
[t1].[Description] AS [Description2], 
[t1].[ProtocolID] AS [ProtocolID2], 
[t1].[VariableTypeID], 
(
    SELECT COUNT(*)
    FROM [dbo].[ProtocolVariables] AS [t2]
    WHERE [t2].[SymbolID] = [t0].[ID]
    ) AS [value]
FROM [dbo].[Symbols] AS [t0]
LEFT OUTER JOIN [dbo].[ProtocolVariables] AS [t1] ON [t1].[SymbolID] = [t0].[ID]
WHERE [t0].[ID] = 3257
ORDER BY [t0].[ID], [t1].[ID]

最佳答案

我设法解决了这个问题:“ProtocolVariables” View 中的 ID 字段必须是唯一的。

我无法熟练地解释它。我只能描述它 - 我希望它能为您节省一些时间。

  1. 我在 *.dbml 文件中添加了表“Symbols”。
  2. 我在 *.dbml 文件中添加了 View “ProtocolVariables”。
  3. 我想添加 Symbols.ID 之间的关联 -> ProtocolVariables.SymbolID
    • 我制作了 ProtocolVariable.ID 主键(否则 VS 向我显示警告)
    • 我添加了协会
    • 我使用 NEWID 函数为 ProtocolVariable.ID 生成唯一值

没有最后一步(NEWID 函数),我观察到我在问题中描述的行为。

关于c# - 设置 DataLoadOptions 时,LINQ 返回错误的项目数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24383505/

相关文章:

c# - 对象类型末尾的 & 字符是什么?

c# - 使用 C# 中的字典,将某些自定义类属性用作同一类中另一个属性(形成为值)的唯一键

java - ubuntu 14.04 上的 JNI4Net

c# - 使用 LINQ 将日期/周列表拆分为 a 和 b 周

mysql - 为什么 MySQL 在搜索索引列时不锁定行

sql - PostgreSQL 与 json 数组中的模式反向 LIKE

c# - 如何使用 LINQ 选择具有最高值的项目?

c# - 无法转换类型为 'System.Collections.Generic.List` 的对象 1[System.Decimal ]' to type ' System.IConvertible'

c# - 在 LINQ 中表达 Oracle LISTAGG() 功能?

sql - 没有 WHERE 只有 ORDER BY 和 LIMIT 的 PostgreSQL 查询不使用索引