小编SBF*_*ies的帖子

如何在C#中捕获通用异常的所有变体

我想捕获一个通用异常类的所有变体,并且我想知道是否有一种方法可以在没有多个catch块的情况下进行。例如说我有一个异常类:

public class MyException<T> : Exception
{
    public string MyProperty { get; }

    public MyException(T prop) : base(prop.ToString())
    {
        MyProperty = prop?.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

和两个派生类:

public class MyDerivedStringException : MyException<string>
{
    public MyDerivedStringException(string prop) : base(prop)
    {

    }
}

public class MyDerivedIntException : MyException<int>
{
    public MyDerivedIntException(int prop) : base(prop)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以同时捕获MyDerivedStringExceptionMyDerivedIntException捕获一个捕获块。

我已经试过了:

try
{
   ...
}

catch(Exception e) when (e is MyDerivedStringException || e is MyDerivedIntException)
{
}
Run Code Online (Sandbox Code Playgroud)

但是它不是很干净,意味着我无法使用MyProperty

我对问题的一般解决方案感兴趣,但是在我的情况下,通用异常是在第三方库中定义的,如下所述,该库为问题增加了一些其他约束。

c# generics exception

13
推荐指数
2
解决办法
442
查看次数

.Net Core在HttpResponseMessage中返回一个int

我正在尝试在.Net Core中复制以下ASP.Net代码:

return Request.CreateResponse( HttpStatusCode.OK, 100 );
Run Code Online (Sandbox Code Playgroud)

我试过了:

using (MemoryStream ms = new MemoryStream())
{
    using (StreamWriter sw = new StreamWriter(ms))
    {
        sw.Write(100);
        return new HttpResponseMessage(HttpStatusCode.OK) {Content = new StreamContent(sw.BaseStream)};
    }
}
Run Code Online (Sandbox Code Playgroud)

但它并没有给我我想要的结果.我正在使用遗留API,它必须从响应流中读取整数,因此我无法更改设计.

下面是接收响应的代码,TryParse总是失败,我需要它才能成功.不幸的是我无法调试它:

using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    string result = reader.ReadToEnd();

    int value = 0;

    if (Int32.TryParse(result, out value))
    {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net .net-core asp.net-core-2.0

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

为什么我看到 .Cast&lt;int&gt;() 和 .Select(a =&gt; (int)a) 之间的区别?

我正在尝试找出以下内容之间的区别:

someListOfEnums.Cast<int>()
Run Code Online (Sandbox Code Playgroud)

someListOfEnums.Select(a => (int)a)?
Run Code Online (Sandbox Code Playgroud)

我发现前者Where在 Entity Framework Core 3.1的子句中使用时会导致异常,但后者不会。我本来希望他们采取类似的行动。

举个例子: public enum Fruit { Apple, Banana, Orange }

public class FruitTable
{
    public int Id { get; set; }
    public Fruit Value { get; set; }
}

public class FruitContext : DbContext
{
    public DbSet<FruitTable> Fruit { get; set; }
}

public void TestMethod(FruitContext context)
{
    var list = new List<Fruit>{Fruit.Apple, Fruit.Orange};

    var breaks = list.Cast<int>();
    var works = list.Select(a => (int)a);

    var fruits1 = context.Fruit.Where(a …
Run Code Online (Sandbox Code Playgroud)

c# linq casting .net-core ef-core-3.1

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

为什么在Entity Framework Core中将CTE与Include一起使用会导致此错误:“调用存储过程时不支持Include操作”

我意识到这个问题与类似,但是(我的感觉是)一个关键的区别是表面上我的代码不涉及存储过程。

本质上,我正在尝试这样做:

FormattableString fs = $"My Statment";

var x = _myEntitySet.FromSql(fs)
                .Include(a => a.SubTable)
                .Include(a => a.OtherTable)
                .ToList();
Run Code Online (Sandbox Code Playgroud)

我发现的是,如果我的SQL查询包含CTE(公用表表达式)-甚至像这样简单:

FormattableString fs = $"WITH CTE AS (SELECT 1 AS [Column1]) SELECT * From MyTable}";
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

调用存储过程时不支持Include操作。

因为我没有(知道)调用存储过程,所以发现错误很奇怪,并且想知道为什么会发生这种错误,是否想办法解决该错误,以便可以Include与包含一个或多个CTE的SQL语句一起使用。

我正在使用Entity Framework Core 2.0。

c# stored-procedures common-table-expression entity-framework-core

5
推荐指数
0
解决办法
589
查看次数

有没有办法直接查询Entity Framework Core使用的内存数据库?

我正在使用内存数据库提供程序对 .Net Core 2.2 应用程序进行一些测试。我需要使应用程序中的一个表无法访问 - 通过重命名或删除它。有没有办法直接对内存数据库运行这种查询?我尝试使用以下方式建立连接:

context.Database.GetDbConnection();
Run Code Online (Sandbox Code Playgroud)

但这会引发错误

仅当上下文使用关系数据库提供程序时,才能使用特定于关系的方法。

我知道我可以通过以下方式销毁整个数据库:

context.Database.EnsureDeleted();
Run Code Online (Sandbox Code Playgroud)

但我需要保留它并且只销毁或重命名一张表。

.net c# database entity-framework-core

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

静态方法中的泛型参数调用同一个类 - 有更好的选择吗?

我有一个包含方法的基类.我希望能够使用基类中定义的静态方法从派生类的实例(可能覆盖该方法)中调用该方法.目前我的代码如下所示:

基类

public abstract class BaseClass<T> where T : class, new()
{
    protected BaseClass()
    {

    }

    protected BaseClass(string constructorParam)
    {
        Property = constructorParam;
    }

    protected readonly string Property;

    public virtual void Action(string methodParam)
    {
        //Do some stuff
    }

    public static void DoAction<U>(string constructorParam, string methodParam) where U : BaseClass<T>, new()
    {
        BaseClass<T> myObject = (BaseClass<T>) Activator.CreateInstance(typeof(U), new object[] {constructorParam});
        myObject.Action(methodParam);
    }
Run Code Online (Sandbox Code Playgroud)

}

派生类

public DerivedClass : Migrater<SomeClass>
{
    public DerivedClass()
    {
    }

    public DerivedClass(string constructorParam) : base(constructorParam)
    {
    }

    public …
Run Code Online (Sandbox Code Playgroud)

c#

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

Entity Framework Core 尝试更新模型中标记为 Identity 的列

我有一个数据库表,其中一列是一IDENTITY列(不是手动设置的主键)。我的 EF Core 模型如下所示:

public class Model
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }

    ...Other fields...

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int AnotherId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

尽管有注释,当我对表进行更新时,我发现生成的 SQL 尝试更新列IDENTITY

UPDATE [Model] SET ... [AnotherId] = @p10 ...
WHERE [Id] = @p29;
SELECT @@ROWCOUNT;
Run Code Online (Sandbox Code Playgroud)

这显然失败了,导致抛出异常。我正在使用 Entity Core 2.0,目前无法升级到 2.1。有什么想法为什么数据注释被忽略吗?

c# sql-server entity-framework identity-column ef-core-2.0

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

是否可以获取存储在 SQL 列中的 json 字符串的所有路径

假设我有一个 JSON 数据存储在varchar(max)数据库的列中。是否可以使用 SQL 获取该数据中存在的所有 JSON 路径。例如对于以下 JSON:

{
    "dog":
    { 
        "name":"Rover",
        "age": 6,
        "likes:["catch", "eating"]
    }
}
Run Code Online (Sandbox Code Playgroud)

我会得到以下输出:

$.
$.dog
$.dog.name
$.dog.age
$.dog.likes[0]
$.dog.likes[1]
Run Code Online (Sandbox Code Playgroud)

我研究过包括json_queryand在内的函数json_value,但它们似乎更多的是从 JSON 获取数据,而不是我需要的元数据。

我正在使用 SQL Server 2018。

sql sql-server json json-path-expression

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