小编Tho*_*ser的帖子

TSQL - LEFT JOIN 奇怪的结果

我遇到了一个看似基本的查询(在 SQL Server 2017 CU17 上)结果的问题,我希望人们能够提出一些我可能没有检查或尝试得到正确结果的事情。

问题的前提是我试图识别一个表中的行,而另一个表中存在 ID。这通常可以通过 LEFT JOIN 来完成,在这种情况下,查询非常简单,如下所示:

SELECT  t1.id,
        t2.id
FROM Table1 AS t1
LEFT JOIN Table2 t2 ON t2.id = t1.id
WHERE t2.id IS NULL
Run Code Online (Sandbox Code Playgroud)

此查询应根据“id”列识别 Table1 中存在但 Table2 中不存在的行,并且针对运行查询时未以任何方式操作的静态数据运行。

LEFT JOIN查询结果图

我从中得到一个奇怪的结果,其中返回 t1.id 的行,但 t2.id 为 NULL - 就好像 t1 中存在行,但 t2 中不存在行。但是,如果我获取从第一个查询返回的 ID 之一,并手动检查它是否存在于两个表中,则看起来该 id 确实存在于两个表中 - 即使我将该 id 放入带有内部联接的查询中,例如如下:

SELECT  t1.id,
        t2.id
FROM Table1 AS t1
INNER JOIN Table2 t2 ON t2.id = t1.id
WHERE t1.id = 761179370
Run Code Online (Sandbox Code Playgroud)

给定 ID 图像的 INNER JOIN 查询结果

如果多次运行 LEFT JOIN 查询,每次都会返回不同数量的行。需要注意的是,id 列都是 int …

sql t-sql sql-server

7
推荐指数
1
解决办法
500
查看次数

form1.designer.cs和form1.resx的目的

我一直在做vb.net一段时间,我不明白这两个的目的:

form1.designer.cs和form1.resx

有人可以向我解释一下吗?

c# winforms

6
推荐指数
1
解决办法
3862
查看次数

Visual Studio 设计器中的抽象通用 UserControl 继承

在我的一个项目中,我使用了一个抽象的 UserControl。为了能够在 Visual Studio 中设计此控件,我使用了此答案中提出的代码。现在我想将其与另一个通用的抽象 UserControl 一起使用。但如果我这样做

[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<MyBaseControl<T>, UserControl>))]
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误

CS0416:属性参数不能使用类型参数

删除类型参数显然也无法编译。

我无法从非泛型基类派生 MyBaseControl,因为它已经从泛型基类派生,因此我尝试用接口装饰它并像这样使用它:

[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<IMyBaseControl, UserControl>))]
Run Code Online (Sandbox Code Playgroud)

确实可以编译,但是当我打开设计视图时,我的控件没有被渲染,而是出现错误

提供的泛型参数数量不等于泛型类型定义的数量。

有办法解决这个问题吗?

c# designer windows-forms-designer visual-studio winforms

6
推荐指数
1
解决办法
1846
查看次数

接口内静态字段的惯用用例是什么?

我在这个网站上搜索了任何标记为 内容,发现这个主题很少出现。其他网站上的例子也同样不令人满意,我自己还没有想出任何办法。因此,我发现很难想到包含静态字段的接口的用例。

是否有任何设计模式或任何其他习惯用法建议在接口内部使用静态字段?

c# static design-patterns field interface

6
推荐指数
1
解决办法
610
查看次数

Path.GetDirectoryName 在 UNC 路径上返回 null

Path.GetDirectoryName(@"C:\\");
Run Code Online (Sandbox Code Playgroud)

返回 null 和

Path.GetDirectoryName(@"C:\\Foo");
Run Code Online (Sandbox Code Playgroud)

返回 C:\

虽然这正是文档中提到的行为,但我想知道为什么

Path.GetDirectoryName(@"\\server.domain.tld\Foo");
Run Code Online (Sandbox Code Playgroud)

返回 null 而不是我所期望的 \server.domain.tld\

有谁知道为什么?

.net c#

5
推荐指数
1
解决办法
2610
查看次数

为什么增量运算符可以在属性上而ref不是

假设你有这样的课程

public class Foo
{
   public int Bar { get; set; } = 42;
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试将该属性作为ref参数传递,则编译器会发出错误

CS0206属性或索引器不能作为out或ref参数传递

因为在实践中在上面的例子中财产被编译成这是可以理解get_Bar()set_Bar()方法.但是如果你在属性上使用增量运算符,比如

var foo = new Foo();
foo.Bar++;
Run Code Online (Sandbox Code Playgroud)

它按预期工作.为此,编译器需要生成类似这样的伪代码:

var foo = new Foo();
int tmp = foo.get_Bar();
tmp++;
foo.set_Bar(tmp);
Run Code Online (Sandbox Code Playgroud)

所以理论上编译器可以做类似的事情ref:

var foo = new Foo();
int tmp = foo.get_Bar();
DoSomething(ref tmp);
foo.set_Bar(tmp);
Run Code Online (Sandbox Code Playgroud)

有没有技术上的原因,编译器不这样做,或者这只是C#团队的设计决定?

c# properties ref

5
推荐指数
1
解决办法
1950
查看次数

为什么不能将??运算符应用于泛型类型,但可以应用空检查?

如果我有一个通用函数返回a T或一些默认值,我想使用??运算符

T f<T>(T a, T b)
{
    return a ?? b;
}
Run Code Online (Sandbox Code Playgroud)

消息失败

运算符“ ??” 不能应用于'T'和'T'类型的操作数

我认为这是因为T可能无法为空。但我还要假设??上面的运算符应该执行与

T f<T>(T a, T b)
{
    var a_ = a;
    return a_ != null ? a_ : b;
}
Run Code Online (Sandbox Code Playgroud)

第二个代码可以毫无问题地进行编译。

那么,为什么这些案件即使应该采取同样的措施也要以不同的方式处理?

c#

5
推荐指数
1
解决办法
98
查看次数

接口不能用作类型参数。静态成员在接口中没有最具体的实现

我有以下使用 .NET 7 的静态抽象成员功能的实现:

public interface IFoo
{
    public static abstract string Bar { get; }
}

public class Foo : IFoo
{
    public static string Bar => "Bar"
}
Run Code Online (Sandbox Code Playgroud)

现在,每当我使用接口作为泛型类的类型参数时,我都会收到错误。例如,如果我的 Program.cs 如下所示:

List<IFoo> fooList = new List<Foo>();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误CS8920:接口“IFoo”不能用作类型参数。静态成员“IFoo.Bar”在接口中没有最具体的实现。

我猜想,无论出于什么原因,这是 C# 的限制。不过,我可能是错的,所以现在我问:有没有办法解决这个问题,或者至少绕过这个限制?

.net c#

5
推荐指数
1
解决办法
1213
查看次数

c#typeof应用于泛型参数超类型

我有一个方法,它没有任何T参数.

遗憾的是,如下所示,C#typeof运算符不适用于泛型.

public static string ToString(object obj)
{
    if (obj.GetType() == typeof(List<object>))
    {
        return "Bug: Never called";
    }
    if (obj.GetType() == typeof(List<int>))
    {
        return "Method only works for int lists";
    }
    return "";
}
Run Code Online (Sandbox Code Playgroud)

预期输出:ToString(整数列表)将返回"Bug:Never Called".

实际输出:"方法仅适用于int列表"

这在Java中运行得非常好.你会说c#中的泛型不支持这个.如何重构我的代码以使"ToString(object)"方法适用于对象列表?

要求:您不能修改方法的签名,只能修改它的实现.

不幸的是你不能让"int"类实现一个接口.因为int类是由Microsoft编写的.因此我无法在int类型上添加访问者模式.

c# generics wildcard typeof

4
推荐指数
1
解决办法
2356
查看次数

Ada:循环导致后面的代码无法访问

我是艾达的新手。我正在尝试使以下代码工作:

begin
Ada.Text_IO.Put_Line("Student ID Score");
Ada.Text_IO.Put_Line("===================");
readAnswers(pAnswers, 1);

loop
declare
   counter : Integer := 0;
   studentInput : String := Get_Line(Input);
   studentScore : Integer;
begin
   numOfTests := numOfTests + 1;
   current_student.ID := GetID(studentInput);
   Ada.Text_IO.Put(Ada.Strings.Unbounded.To_String(current_student.ID));
   readAnswers(studentInput (6 .. studentInput'Last) ,0);
   studentScore := scoreTest(current_student.student_answer, current_answer_key, number_of_questions);
      Ada.Integer_Text_IO.Put(studentScore);
      New_Line(1);
end;
end loop;

Ada.Text_IO.Put_Line("===================");
Ada.Text_IO.Put("Tests Graded = ");
Ada.Integer_Text_IO.Put(numOfTests);
end;
Run Code Online (Sandbox Code Playgroud)

不幸的是,GNAT 告诉我循环之后的所有代码都无法访问。我怎样才能让这个程序执行循环和它之后的代码?

ada

4
推荐指数
1
解决办法
128
查看次数