内存中有一个包含50,000 个产品 ID 的列表。我想从数据库获取所有这些产品。使用dbContext.Products.Where(p => list.contains(p.ID))在 SQL 中生成一个巨大的 IN - WHERE ID IN (2134,1324543,5675,32451,45735...),并且需要很长时间。部分原因是SQL Server解析这么大的字符串需要时间,而且执行计划也很糟糕。(我通过尝试使用临时表知道这一点)。
所以我使用 SQLBulkCopy 将 ID 插入到临时表中,然后运行
dbContext.Set<Product>().SqlQuery("SELECT * FROM Products WHERE ID IN (SELECT ID FROM #tmp))"
Run Code Online (Sandbox Code Playgroud)
这提供了良好的性能。但是,现在我需要产品及其供应商(每种产品有多个)。使用自定义 SQL 命令无法取回我所知道的复杂对象。那么我如何使用临时表从供应商那里获取产品呢?
(如果我可以以某种方式引用 LINQ 中的临时表,那么就可以了 - 我可以这样做dbContext.Products.Where(p => dbContext.TempTable.Any(t => t.ID==p.ID))。如果我可以在 UDF 中引用它,那也很好 - 但你不能。我不能使用真正的表,因为并发用户会使它处于不一致的状态。)
谢谢
有以下2个实体,具有以下属性:
Parent
ID
Children
Child
ID
ParentID
Parent
Run Code Online (Sandbox Code Playgroud)
现在我有以下代码:
db.Configuration.AutoDetectChangesEnabled = false;
var child1=new Child();
parent.Children.Add(child1);
db.ChangeTracker.DetectChanges();
parent.Children.Remove(child1);
var child2=new Child();
child2.Parent=parent;
child2.ParentID=parent.ID;
db.Children.add(child2);
Run Code Online (Sandbox Code Playgroud)
此时,child1和child2完全相同.Parent和ParentID属性具有相同的值(即parent).检查它们的dbContext entry也显示完全相同的信息,例如,OriginalValues对于两者都是空的.
db.ChangeTracker.DetectChanges但是,如果我现在调用,则child1.Parent变为null,而child2.Parent保持其值.EF如何知道这样做 - 它在哪里保留所需的信息才能产生这种差异?
谢谢你的任何想法
有很多文章(比如这个和这个)展示了如何添加要发布的文件,他们都说要在发布配置文件(.pubxml)中添加这样的内容:
<Target Name="CustomCollectFiles">
<ItemGroup>
<_CustomFiles Include="..\Extra Files\**\*" />
<FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
<DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)
为什么需要新_CustomFiles项目?为什么不简单<FilesForPackagingFromProject Include="..\Extra Files\**\*">?我尝试过,由于某种原因,这会导致项目中的每个文件都在已部署的Extra Files文件夹中结束.有人能解释一下这种行为吗?
NamedPipeServerStream server=new NamedPipeServerStream("aaqq");
var ct=new CancellationTokenSource();
ct.CancelAfter(1000);
server.WaitForConnectionAsync(ct.Token).Wait();
Run Code Online (Sandbox Code Playgroud)
我希望最后一行OperationCanceledException在一秒钟后抛出一个,但它会永远挂起。为什么?
在我的表单构造函数中创建CustomPropertyList类.
form(String ^s)
{
InitializeComponent();
CustomPropertyList ^propertyList = gcnew CustomPropertyList(s);
...
Run Code Online (Sandbox Code Playgroud)
CustomPropertyList类有一个析构函数
CustomPropertyList::~CustomPropertyList()
{
if (MessageBox::Show("Do you want to save your changes?","Editin",MessageBoxButtons::YesNo)==DialogResult::Yes)
...
Run Code Online (Sandbox Code Playgroud)
程序退出时为什么不调用它?(我知道这不是因为我没有看到消息框,那里有一个断点)
我非常感谢任何帮助
无论使用何种互操作技术,每次托管函数调用非托管函数时都需要特殊的转换序列(称为thunks),反之亦然.这些thunk是由Visual C++编译器自动插入的,但重要的是要记住,累积起来,这些转换在性能方面可能很昂贵.
然而,CLR肯定会一直调用C++和Win32函数.为了处理文件/网络/窗口以及几乎任何其他内容,必须调用非托管代码.它是如何摆脱分块惩罚的?
这是一个用C++/CLI编写的实验,可能有助于描述我的问题:
#define REPS 10000000
#pragma unmanaged
void go1() {
for (int i = 0; i < REPS; i++)
pow(i, 3);
}
#pragma managed
void go2() {
for (int i = 0; i < REPS; i++)
pow(i, 3);
}
void go3() {
for (int i = 0; i < REPS; i++)
Math::Pow(i, 3);
}
public ref class C1 {
public:
static void Go() {
auto sw = Stopwatch::StartNew();
go1();
Console::WriteLine(sw->ElapsedMilliseconds);
sw->Restart();
go2();
Console::WriteLine(sw->ElapsedMilliseconds);
sw->Restart();
go3();
Console::WriteLine(sw->ElapsedMilliseconds); …Run Code Online (Sandbox Code Playgroud) 我正在使用 Visual Studio 2008,带有 .net 框架、C++/CLI。我的程序仅在调试模式下运行(即使从资源管理器运行) - 但在发布模式下它说程序已停止工作。(但如果我在释放模式时按 F5,它运行正常)所有设置都是相同的。会是什么呢?请问有人有什么建议吗?
string host = "gauntlet.asoshared.com", username= "a@a.test", pwd = "abc",
from = "a@a.test", to = "b@b.test";
int port = 465;
var mm = new MailMessage(from, to);
mm.Body = "b1";
mm.Subject = "s1";
mm.IsBodyHtml=false;
using (var smtp=new SmtpClient(host, port)) {
smtp.EnableSsl = true;
smtp.Credentials = new NetworkCredential (username, pwd);
smtp.Send(mm);
}
Run Code Online (Sandbox Code Playgroud)
这一直停留在smtp.Send. 大约 2 分钟后,我收到超时错误。使用 Outlook,它可以完美运行(使用我的真实凭据)。查看 Wireshark,在运行此代码时,我看到 TCP SYN、SYN-ACK、ACK,然后什么也没有。使用 Outlook 时,这些后跟一个TLSv1.2 Client Hello等。
尝试在代码开头添加以下几行:
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.Expect100Continue=false;
Run Code Online (Sandbox Code Playgroud)
为什么 C# …
c# ×5
.net ×3
c++-cli ×3
ajax ×1
android ×1
asynchronous ×1
c++ ×1
javascript ×1
msbuild ×1
named-pipes ×1
smtp ×1
sql ×1
sql-server ×1