我对这个问题有更好的标题的建议持开放态度.
对于使用Entity Framework足够长的人来说,您必然会遇到IQueryable<T>数据库无法执行生成的问题.这源于这样一个事实:IQueryable<T>除了内存实现(例如LINQ to objects)之外,不可能完全实现.诸如C#方法调用和使用Single/ SingleOrDefault作为非最终查询操作之类的事情在发送到真实IQueryProvider(例如MSSQL或Oralce)时会导致失败,但会传递单元测试.
我目前知道如何测试这些情况的唯一方法是实际运行该软件.虽然我同意该软件绝对应该作为编写新查询(或一般新代码)的一部分来完成,但如果使用单元测试可以找到这些类型的错误会很有帮助.导致我在这里的事件是发现了一个新的错误,我确信开发人员是一个无辜和安全的变化.更进一步,通过大量的单位测试给出了一种虚假的信心感.
是否有可能验证IQueryable<T>生产的产品实际上可以通过单元测试在特定的数据库技术(MSSQL,Oracle,等等)上运行?
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作为非最终查询操作,这将失败.
还有其他情况,但我认为以上两个例子描述了我试图能够检测到的内容.
想象一下下面的表格结构
---------
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# 中使用临时联合来做一些疯狂的事情。这是一种以您想要的任何随机方式读取内存的非常酷的方式,但您必须小心。例如,您可能会进入损坏状态,其中变量 my 明确存在,byte[]但在调试器中查看的值为int[]. 我什至不知道这样的事情是可能的!
注意:Marc 在下面的评论中提出了一个非常重要的观点。由于字节顺序,您无法使用像这样的重叠结构概念可靠地将数字直接转换为字节。在这种情况下,您可以安全地使用整数,因为十进制类型在内部使用了 4 个整数。这是来自 protobuf-net 的十进制序列化程序的 [示例]。
第一次尝试尝试在 0 偏移处使用带有 adecimal和byte[]字段的结构联合概念,因此它们占用完全相同的内存位置。然后我可以写入一个字段并从另一个字段读取。
[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)