我想知道如何在列表中存储orderby表达式.这就是我想写的:
List<Expression<Func<Products,Object>>> list = new List<Expression<Func<Products,Object>>>()
{
p => p.Name,
p => p.Id
};
Run Code Online (Sandbox Code Playgroud)
然后:
var expr = list[0];
myProducts.OrderBy( expr );
Run Code Online (Sandbox Code Playgroud)
该工程p.Name,但不工作p.Id(list[1]),因为它降低follwing例外
EntityFramework.SqlServer.dll中出现未处理的"System.NotSupportedException"类型异常附加信息:无法将类型"System.Int32"强制转换为"System.Object"类型.LINQ to Entities仅支持转换EDM原语或枚举类型.
我必须使用什么类型的列表?
在我的代码中有要处理的事务:
using (var scope = new TransactionScope())
{
repo1.SaveSomething();
repo2.SaveAnythingElse();
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
在 repo1 和 repo2 函数内部使用 using 创建自己的数据库上下文,并处理它们,事务就像一个魅力。
现在我添加另一个这样的代码,它开始丢弃一个异常:
底层提供程序在 Open 上失败。(EntityFramework) 分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中为网络访问启用 DTC。(System.Transactions) 事务管理器已禁用对远程/网络事务的支持。
我读到当连接在事务内部打开时,尽管具有相同的 sql server 相同的 db - 它需要 MSDTC 组件来处理它。我将代码更改为以下内容:
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted }))
{
....
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
现在异常消失了。
我的问题:
我认为简单的问题:) 任何帮助将不胜感激!
c# msdtc entity-framework transactions distributed-transactions
我想使用 SwashBuckle 返回文件流
[System.Web.Http.HttpGet]
[System.Web.Http.Route("Files/{uid}/file")]
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(Byte[]))]
public HttpResponseMessage DownloadFile(String uid, String fileName)
{
return Safe.Execute(() =>
{
var api = new FileApi();
var stream = api.GetFile(uid, fileName);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition =
new ContentDispositionHeaderValue("attachment")
{
FileName = CalcFileName(fileName)
};
return result;
});
}
Run Code Online (Sandbox Code Playgroud)
我看到文件已返回,但是......不知何故......编码。一个 3798 长的文件通过 UI 下载后变成了 5789 字节,文件内容与预期非常相似,但包含了额外的字节,就像它会被解释为字符串并成为 UTF-8 编码版本一样。
当我将其替换为:
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(Stream))]
Run Code Online (Sandbox Code Playgroud)
Swagger 生成的描述符如下所示:
"produces": [
"application/json",
"text/json",
"application/xml",
"text/xml"
],
... …Run Code Online (Sandbox Code Playgroud) 我有一个C#函数,一个回调,从用C++编写的Win32 DLL调用.调用者给了我一个UTF8字符串,但是我无法正确接收它,所有匈牙利语的特殊字符都出错了.
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int func_writeLog(string s);
Run Code Online (Sandbox Code Playgroud)
当我将参数类型更改为IntPtr并编写代码时,它会正确写入.但我发现这是一个非常缓慢的解决方案:
byte[] bb = new byte[1000];
int i = 0;
while (true)
{
byte b = Marshal.ReadByte(pstr, i);
bb[i] = b;
if (b == 0) break;
i++;
}
System.Text.UTF8Encoding encodin = new System.Text.UTF8Encoding();
var sd = encodin.GetString(bb, 0, i);
Run Code Online (Sandbox Code Playgroud)
我试着给string参数写一些属性,比如:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int func_writeLog([In, MarshalAs(UnmanagedType.LPTStr)] string s);
Run Code Online (Sandbox Code Playgroud)
没有人在工作.有什么建议吗?提前致谢!
我想知道 LINQ OrderBy 是如何编写的?我尝试重现:
IOrderedQueryable<T> MyOrderBy<T,TKey>(IQueryable<T> qry, Expression<Func<T,TKey> expr)
{
return qry.OrderBy(expr);
}
Run Code Online (Sandbox Code Playgroud)
可以称为:
MyOrderBy<Products,String>(qry, p=>p.Name);
Run Code Online (Sandbox Code Playgroud)
将其重构为 IQueryable 的扩展方法,可以这样调用:
qry.MyOrderBy<String>(p => p.Name );
Run Code Online (Sandbox Code Playgroud)
这与 LINQ OrderBy 不同,LINQ OrderBy 不需要 String 类型参数。在我的版本中如何避免这种情况?
ps:Object 不是替代方案,因为它不适用于 Int32 和其他值类型字段(以及 EF Linq):
IOrderedQueryable<T> MyOrderByObject<T>(IQueryable<T> qry, Expression<Func<T,Object> expr)
{
return qry.OrderBy(expr);
}
Run Code Online (Sandbox Code Playgroud)
将抛出异常(如果 ID 是 Int32 字段):
qry.MyOrderByObject(p => p.ID ); // throws an exception
Run Code Online (Sandbox Code Playgroud) 我有一个WCF服务,它将打开一个文件,然后将其流返回给客户端。客户端使用stream将流内容保存到文件中。CopyTo(...)然后关闭返回的流。
完成此“下载”步骤之后,我们尝试使用另一个WCF API调用删除服务器上的文件,但是我们得到一个“进程无法访问该文件...,因为该文件正在被另一个进程使用。(mscorlib)”异常。几分钟后,此“锁”消失,可以删除该文件。
如果客户端流Close()无法解决问题,我该怎么办才能使服务器释放流并让文件删除?
在我的方法中,我想处理可空的整数值.
public String FormatValue(Int32? item)
{
if (item.HasValue==false) return "";
return item.Value.ToString("### ### ###");
}
Run Code Online (Sandbox Code Playgroud)
我们这样做没有想写Int32?,Int64?和其他版本的这种方法,所以我们要重构它来处理泛型类型参数:
public String FormatValue<T>(T item)
{
if (item.HasValue==false) return ""; // ERROR: no .HasValue property
return item.Value.ToString("### ### ###"); // ERROR: usually has no ToString() with string argument
}
Run Code Online (Sandbox Code Playgroud)
我该如何处理这种情况?我试图使用该"where T"条款,但没有任何成功.
假设我们有一个像这样的动作执行包装器:
private void ExecuteAction(Action action)
{
Console.WriteLine($"starting action ...");
action();
Console.WriteLine($"finished action ...");
}
Run Code Online (Sandbox Code Playgroud)
假设我们这样称呼它:
ExecuteAction( async () => { ... } ); // 1
Run Code Online (Sandbox Code Playgroud)
或者像这样:
ExecuteAction( () => { ... } ); // 2
Run Code Online (Sandbox Code Playgroud)
我想知道这两个调用有什么区别以及ExecuteAction()方法内部如何处理?有什么区别吗?
以下 d、e、f 值之间的真正区别是什么?'ToUniversalTime()' 到底是做什么的?
var d = DateTime.Now;
var e = d.ToUniversalTime();
var f = e;
Run Code Online (Sandbox Code Playgroud)
有人知道吗?谢谢。
备注:当“创建”字段是日期时间 sql 字段并且包含 UTC 时间时,我们检测到 EF 查询的差异:
var itemsD = ctx.Log.Where(p => p.Created > d);
var itemsE = ctx.Log.Where(p => p.Created > e);
Run Code Online (Sandbox Code Playgroud)