我想捕获一个通用异常类的所有变体,并且我想知道是否有一种方法可以在没有多个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)
有没有一种方法可以同时捕获MyDerivedStringException
和MyDerivedIntException
捕获一个捕获块。
我已经试过了:
try
{
...
}
catch(Exception e) when (e is MyDerivedStringException || e is MyDerivedIntException)
{
}
Run Code Online (Sandbox Code Playgroud)
但是它不是很干净,意味着我无法使用MyProperty
。
我对问题的一般解决方案感兴趣,但是在我的情况下,通用异常是在第三方库中定义的,如下所述,该库为问题增加了一些其他约束。
我正在尝试在.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) 我正在尝试找出以下内容之间的区别:
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)我意识到这个问题与此类似,但是(我的感觉是)一个关键的区别是表面上我的代码不涉及存储过程。
本质上,我正在尝试这样做:
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
我正在使用内存数据库提供程序对 .Net Core 2.2 应用程序进行一些测试。我需要使应用程序中的一个表无法访问 - 通过重命名或删除它。有没有办法直接对内存数据库运行这种查询?我尝试使用以下方式建立连接:
context.Database.GetDbConnection();
Run Code Online (Sandbox Code Playgroud)
但这会引发错误
仅当上下文使用关系数据库提供程序时,才能使用特定于关系的方法。
我知道我可以通过以下方式销毁整个数据库:
context.Database.EnsureDeleted();
Run Code Online (Sandbox Code Playgroud)
但我需要保留它并且只销毁或重命名一张表。
我有一个包含方法的基类.我希望能够使用基类中定义的静态方法从派生类的实例(可能覆盖该方法)中调用该方法.目前我的代码如下所示:
基类
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) 我有一个数据库表,其中一列是一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。有什么想法为什么数据注释被忽略吗?
假设我有一个 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_query
and在内的函数json_value
,但它们似乎更多的是从 JSON 获取数据,而不是我需要的元数据。
我正在使用 SQL Server 2018。
c# ×7
.net-core ×2
sql-server ×2
.net ×1
asp.net ×1
casting ×1
database ×1
ef-core-2.0 ×1
ef-core-3.1 ×1
exception ×1
generics ×1
json ×1
linq ×1
sql ×1