小编mha*_*and的帖子

如何在没有数据库的情况下验证LINQ可查询

注意:

我对这个问题有更好的标题的建议持开放态度.


背景:

对于使用Entity Framework足够长的人来说,您必然会遇到IQueryable<T>数据库无法执行生成的问题.这源于这样一个事实:IQueryable<T>除了内存实现(例如LINQ to objects)之外,不可能完全实现.诸如C#方法调用和使用Single/ SingleOrDefault作为非最终查询操作之类的事情在发送到真实IQueryProvider(例如MSSQL或Oralce)时会导致失败,但会传递单元测试.

我目前知道如何测试这些情况的唯一方法是实际运行该软件.虽然我同意该软件绝对应该作为编写新查询(或一般新代码)的一部分来完成,但如果使用单元测试可以找到这些类型的错误会很有帮助.导致我在这里的事件是发现了一个新的错误,我确信开发人员是一个无辜和安全的变化.更进一步,通过大量的单位测试给出了一种虚假的信心感.


题:

是否有可能验证IQueryable<T>生产的产品实际上可以通过单元测试在特定的数据库技术(MSSQL,Oracle,等等)上运行?


例子:

使用C#方法调用可查询:

var result = (
    from a in session.Query<A>
    where a.Field == SomeFunction(a)
    select a
    ).ToList();
Run Code Online (Sandbox Code Playgroud)

由于数据库无法执行C#代码的明显原因,这将失败.


可单独查询

var result = (
    from a in session.Query<A>
    where a.Field == session.Query<B>().Single().Field
    select a
    ).ToList();
Run Code Online (Sandbox Code Playgroud)

由于使用single作为非最终查询操作,这将失败.


还有其他情况,但我认为以上两个例子描述了我试图能够检测到的内容.

c# linq unit-testing entity-framework iqueryable

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

LINQ多连接IQueryable修改结果选择器表达式

想象一下下面的表格结构

---------
TableA
ID
Name

---------
TableB
ID
TableAID

---------
TableC
ID
TableBID
Run Code Online (Sandbox Code Playgroud)

我想定义一个连接这三个表并接受Expression<Func<TableA, TableB, TableC, T>>一个选择器的函数.

所以我想要以下内容:

public IQueryable<T> GetJoinedView<T>(Expression<Func<TableA, TableB, TableC, T>> selector)
{
    return from a in DbContext.Set<TableA>()
           join b on DbContext.Set<TableB>() a.ID equals b.TableAID
           join c on DbContext.Set<TableC>() b.ID equals c.TableBID
           select selector;
}
Run Code Online (Sandbox Code Playgroud)

现在,显然上面没有做我想做的事情,这将给我一个IQueryable表达式类型.我可以使用方法链接语法,但最后我需要多个选择器,每个方法链调用一个.有没有办法采取选择器并将其应用于匿名类型,如下面的不完整函数:

public IQueryable<T> GetJoinedView<T>(Expression<Func<TableA, TableB, TableC, T>> selector)
{
    var query = from a in DbContext.Set<TableA>()
                join b on DbContext.Set<TableB>() a.ID equals b.TableAID
                join c on DbContext.Set<TableC>() b.ID …
Run Code Online (Sandbox Code Playgroud)

c# linq expression entity-framework

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

将十进制复制到字节数组而不分配

梦想

我正在寻找一种将十进制值复制到字节数组缓冲区中的方法,然后能够将这些字节读回十进制而无需任何堆分配。理想情况下,这不需要不安全的上下文。

我的尝试

我以前在 C# 中使用临时联合来做一些疯狂的事情。这是一种以您想要的任何随机方式读取内存的非常酷的方式,但您必须小心。例如,您可能会进入损坏状态,其中变量 my 明确存在,byte[]但在调试器中查看的值为int[]. 我什至不知道这样的事情是可能的!

注意:Marc 在下面的评论中提出了一个非常重要的观点。由于字节顺序,您无法使用像这样的重叠结构概念可靠地将数字直接转换为字节。在这种情况下,您可以安全地使用整数,因为十进制类型在内部使用了 4 个整数。这是来自 protobuf-net 的十进制序列化程序的 [示例]。

1: struct union w/decimal 和 byte[]

第一次尝试尝试在 0 偏移处使用带有 adecimalbyte[]字段的结构联合概念,因此它们占用完全相同的内存位置。然后我可以写入一个字段并从另一个字段读取。

[StructLayout(LayoutKind.Explicit)]
private readonly struct convert_decimal_to_bytes
{
    [FieldOffset(0)]
    public readonly decimal value;
    [FieldOffset(0)]
    public readonly byte[] bytes;

    public convert_decimal_to_bytes(decimal value)
    {
        bytes = default;
        this.value = value;
    }
}

Run Code Online (Sandbox Code Playgroud)

这甚至不会在没有抛出的情况下运行 - 类型无法加载以下内容:

System.TypeLoadException : Could not load type 'convert_decimal_to_bytes' from assembly 'teloneum, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because it …
Run Code Online (Sandbox Code Playgroud)

c#

3
推荐指数
1
解决办法
251
查看次数