Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda can';你不做Int16比较吗?_C#_.net_Visual Studio - Fatal编程技术网

C# Lambda can';你不做Int16比较吗?

C# Lambda can';你不做Int16比较吗?,c#,.net,visual-studio,C#,.net,Visual Studio,在我的c#(.NET 4.7.1)代码中有以下lambda表达式: …而且成功了!!(我得到了预期的匹配行。) 这使我得出结论,在.NET中存在一个错误,运行时无法正确评估Int16与smallint sql server列值的比较 除了bug还有什么解释吗?我猜这对任何人来说都应该是很容易被指责的。在MSSQL中创建一个lambda来匹配SMALLINT列,看看会发生什么。确实SMALLINT映射到int16akashort。您可以在进行验证。至于发生了什么,请查看int16 equals的文

在我的c#(.NET 4.7.1)代码中有以下
lambda表达式

…而且成功了!!(我得到了预期的匹配行。)

这使我得出结论,在.NET中存在一个错误,运行时无法正确评估Int16与smallint sql server列值的比较


除了bug还有什么解释吗?我猜这对任何人来说都应该是很容易被指责的。在MSSQL中创建一个lambda来匹配SMALLINT列,看看会发生什么。

确实SMALLINT映射到int16akashort。您可以在进行验证。至于发生了什么,请查看int16 equals的文档:

变量NDRAWING2也需要int16。在Javascript中,有一个运算符“==”,表示值和类型必须相同


通过适当的抽象,使用Microsoft.EntityFrameworkCore.InMemory 2.2.6和NUnit 3.2,我将:

  • 在内存中创建数据库上下文
  • 向服务添加上下文
  • 使用服务添加一些数据并将其存储到数据库
  • 验证它在新上下文中是否有一些数据
  • 使用服务查找我想要的数据
  • 确认它确实找到了数据
代码示例:

class Program
{
    static void Main(string[] args)
    {
        var options = new DbContextOptionsBuilder<DtSkmContext>()
            .UseInMemoryDatabase(databaseName: "Add_writes_to_database")
            .Options;

        using (var context = new DtSkmContext(options))
        {
            var service = new DtSkmService(context);
            service.Add(3, 7);
            context.SaveChanges();
        }

        using (var context = new DtSkmContext(options))
        {
            Assert.That(context.DtSkm.Count(), Is.EqualTo(1));

            var service = new DtSkmService(context);
            var result = service.Find(3, 7);

            Assert.That(result, Is.Not.Null);
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var options=new DbContextOptionsBuilder()
.UseInMemoryDatabase(数据库名称:“添加\写入\到\数据库”)
.选择;
使用(var context=newdtskmcontext(选项))
{
var服务=新的DtSkmService(上下文);
服务。添加(3,7);
SaveChanges();
}
使用(var context=newdtskmcontext(选项))
{
Assert.That(context.DtSkm.Count(),Is.EqualTo(1));
var服务=新的DtSkmService(上下文);
var结果=service.Find(3,7);
Assert.That(结果为.Not.Null);
}
}
}
服务

public class DtSkmService
{
    private DtSkmContext _context;

    public DtSkmService(DtSkmContext context)
    {
        _context = context;
    }

    public void Add(int ndrawing1, Int16 ndrawing2)
    {
        var dtSkm = new DtSkmDto { Ndrawing1 = ndrawing1, Ndrawing2 = ndrawing2 };
        _context.DtSkm.Add(dtSkm);
        _context.SaveChanges();
    }

    public IEnumerable<DtSkmDto> Find(int first, Int16 second)
    {
        return _context.DtSkm
            .Where(b => b.Ndrawing1.Equals(first) && b.Ndrawing2.Equals(second))
            .OrderBy(b => b.Ndrawing1)
            .ToList();
    }
}
公共类DtSkmService
{
专用DtSkmContext\u上下文;
公共DtSkmService(DtSkmContext上下文)
{
_上下文=上下文;
}
公共无效添加(int ndrawing1、Int16 ndrawing2)
{
var dtSkm=new DtSkmDto{Ndrawing1=Ndrawing1,Ndrawing2=Ndrawing2};
_context.DtSkm.Add(DtSkm);
_SaveChanges();
}
公共IEnumerable查找(int-first,Int16-second)
{
return\u context.DtSkm
其中(b=>b.Ndrawing1.Equals(第一)和&b.Ndrawing2.Equals(第二))
.OrderBy(b=>b.Ndrawing1)
.ToList();
}
}
以及dto和上下文

public class DtSkmDto
{
    public int Id { get; set; }
    [Required]
    public int Ndrawing1 { get; set; }
    [Required]
    public Int16 Ndrawing2 { get; set; }
}
public class DtSkmContext : DbContext
{
    public DtSkmContext()
    {
    }
    public DtSkmContext(DbContextOptions<DtSkmContext> options) : base(options)
    {
    }
    public DbSet<DtSkmDto> DtSkm { get; set; }
}
公共类DtSkmDto
{
公共int Id{get;set;}
[必需]
公共int Ndrawing1{get;set;}
[必需]
public Int16 Ndrawing2{get;set;}
}
公共类DtSkmContext:DbContext
{
公共DtSkmContext()
{
}
公共DtSkmContext(DbContextOptions选项):基本(选项)
{
}
公共DbSet DtSkm{get;set;}
}
虽然这使用了efcore和memeorydb,但它展示了一种方法。在您的情况下,您可以对以下内容进行小的更改:

var data = dtSKM.AsEnumerable().ToList();
DataRow[] skmRows = data.Where(x =>
   x.Field<int>("NDRAWING1").Equals(NDRAWING1) &&
   x.Field<Int16>("NDRAWING2").Equals(NDRAWING2)
   ).ToArray();
var data=dtSKM.AsEnumerable().ToList();
DataRow[]skmRows=数据,其中(x=>
x、 字段(“NDRAWING1”)。等于(NDRAWING1)&&
x、 字段(“NDRAWING2”)。等于(NDRAWING2)
).ToArray();

您还可以使用调试器验证数据实例类型/值。您的一个假设不成立,也不是“.NET中的错误”。

可能是映射问题或代码中的某个问题。没有答案很难说。您需要提供映射结构、DDL和EF(我认为您是如何使用EF的?)以及模型(例如,什么是
字段(字符串)
),这在手动构建的
数据表
上运行良好。NDRAWING1/2的一些值是什么?您需要提供更多信息,您选择的代码片段不足以确定问题。数据表认为它有哪些类型?(屏幕截图是调试吗?)。您应该显示NDRAWING2声明的代码,清楚地显示类型,等等。Margus,我很困惑……似乎您只是在重复我最初声明的内容。NDRAWING2为Int16,但未找到匹配项。所以我必须在DB和代码中将其更改为int。我不确定你是如何给出解决方案的。你在我的帖子里仔细看过我原来的lambda了吗?那里是Int16,它不工作。换句话说,您建议对代码进行哪些更改以使其作为Int16工作?@HerrimanCoder在您的原始帖子中,您没有显示如何声明
NDRAWING1
NDRAWING2
(如
Equals(NDRAWING1)
)。您会说“为了好玩,我将sql server中的数据类型从smallint更改为int,并将lambda更改为:”但您不会说您更改了常量的类型
NDRAWING2
。因此@Margus需要澄清这一点。丹尼尔,好问题……我不记得我是将NDRAWING2定义为
int
还是
Int16
。如果我把它定义为Int16,那么这个谜团仍然存在。但如果我心不在焉地将其定义为int,然后尝试在lambda中将其用作int 16,那么谜团就解决了。几天前我将它改为int,并将mssql中的对应列改为int,以使一切正常工作。现在我不记得我最初是怎么得到它的-(
public class DtSkmDto
{
    public int Id { get; set; }
    [Required]
    public int Ndrawing1 { get; set; }
    [Required]
    public Int16 Ndrawing2 { get; set; }
}
public class DtSkmContext : DbContext
{
    public DtSkmContext()
    {
    }
    public DtSkmContext(DbContextOptions<DtSkmContext> options) : base(options)
    {
    }
    public DbSet<DtSkmDto> DtSkm { get; set; }
}
var data = dtSKM.AsEnumerable().ToList();
DataRow[] skmRows = data.Where(x =>
   x.Field<int>("NDRAWING1").Equals(NDRAWING1) &&
   x.Field<Int16>("NDRAWING2").Equals(NDRAWING2)
   ).ToArray();