小编Zol*_*yak的帖子

Linq:Queryable.OrderBy()使用表达式集合

我想知道如何在列表中存储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原语或枚举类型.

我必须使用什么类型的列表?

c# linq lambda entity-framework

8
推荐指数
1
解决办法
811
查看次数

.NET TransactionScope 和 MSDTC

在我的代码中有要处理的事务:

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

5
推荐指数
1
解决办法
2876
查看次数

使用 SwashBuckle 返回文件流

我想使用 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# stream swagger swashbuckle

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

C#回调接收UTF8字符串

我有一个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)

没有人在工作.有什么建议吗?提前致谢!

c# c++ string callback utf-8

4
推荐指数
1
解决办法
1543
查看次数

通用 LINQ orderby lambda 函数

我想知道 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)

c# linq lambda entity-framework

4
推荐指数
1
解决办法
3554
查看次数

WCF服务返回流,但不会关闭

我有一个WCF服务,它将打开一个文件,然后将其流返回给客户端。客户端使用stream将流内容保存到文件中。CopyTo(...)然后关闭返回的流。

完成此“下载”步骤之后,我们尝试使用另一个WCF API调用删除服务器上的文件,但是我们得到一个“进程无法访问该文件...,因为该文件正在被另一个进程使用。(mscorlib)”异常。几分钟后,此“锁”消失,可以删除该文件。

如果客户端流Close()无法解决问题,我该怎么办才能使服务器释放流并让文件删除?

c# wcf stream

4
推荐指数
1
解决办法
772
查看次数

泛型类型nullable和ToString

在我的方法中,我想处理可空的整数值.

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"条款,但没有任何成功.

c# generics nullable tostring

2
推荐指数
1
解决办法
338
查看次数

操作是否异步?

假设我们有一个像这样的动作执行包装器:

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()方法内部如何处理?有什么区别吗?

c# action asynchronous async-await

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

.ToUniversalTime() 在 DateTime 实例 (C#) 上真正做什么?

以下 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)

c# datetime utc

0
推荐指数
1
解决办法
292
查看次数