我不是初学者使用SQL数据库,特别是SQL Server.但是,我主要是一个SQL 2000的人,我一直对2005年以上的模式感到困惑.是的,我知道架构的基本定义,但它们在典型的SQL Server部署中实际使用了什么?
我一直只使用默认架构.为什么我要创建专门的模式?为什么要分配任何内置模式?
编辑:澄清一下,我想我正在寻找架构的好处.如果您只是将其用作安全方案,那么数据库角色似乎已经填满了......呃..嗯..角色.使用它作为命名空间说明符似乎是你可以用所有权完成的事情(dbo与用户等等).
我想我所得到的是,Schemas做了什么,你不能对业主和角色做什么?他们的特殊利益是什么?
我需要修改现有程序,它包含以下代码:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Run Code Online (Sandbox Code Playgroud)
但这对我来说似乎很奇怪,首先是使用async和await选择.根据Stephen Cleary的回答,我应该能够放弃这些.
然后第二个Select选择结果.这是不是意味着任务根本不是异步的并且是同步执行的(没有任何努力),或者异步执行任务,何时完成查询的其余部分?
我应该根据Stephen Cleary的另一个答案写下面的代码如下:
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
Run Code Online (Sandbox Code Playgroud)
这是完全一样的吗?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Run Code Online (Sandbox Code Playgroud)
当我正在研究这个项目时,我想更改第一个代码示例,但我不太热衷于更改(显然工作)异步代码.也许我只是担心什么都没有,所有3个代码示例完全相同?
ProcessEventsAsync如下所示:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Run Code Online (Sandbox Code Playgroud) 像这样的问题的答案:List <T>或IList <T>似乎总是同意返回一个接口比返回一个集合的具体实现更好.但我正在努力解决这个问题.实例化接口是不可能的,因此如果您的方法返回一个接口,它实际上仍然返回一个特定的实现.我通过编写两个小方法来尝试一下这个:
public static IList<int> ExposeArrayIList()
{
return new[] { 1, 2, 3 };
}
public static IList<int> ExposeListIList()
{
return new List<int> { 1, 2, 3 };
}
Run Code Online (Sandbox Code Playgroud)
并在我的测试程序中使用它们:
static void Main(string[] args)
{
IList<int> arrayIList = ExposeArrayIList();
IList<int> listIList = ExposeListIList();
//Will give a runtime error
arrayIList.Add(10);
//Runs perfectly
listIList.Add(10);
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,当我尝试添加新值时,我的编译器没有给我任何错误,但显然IList<T>当我尝试向其添加内容时,将我的数组公开为暴露的方法会产生运行时错误.因此,那些不知道我的方法中发生了什么,并且必须为其添加值的人,被迫首先将我复制IList到a List以便能够添加值而不会有错误.当然,他们可以做一个类型检查,看看他们是否正在处理a List或者a Array,但是如果他们不这样做,并且他们想要将项目添加到集合中,他们别无选择将其复制IList到a List,即使它已经是一个List.数组永远不会暴露为IList?
我的另一个问题是基于相关问题的接受答案(强调我的):
如果您通过其他人将使用的库公开您的类, …
好的,所以我试图通过http连接发送POST命令,并使用JSON格式来执行此操作.我正在编写程序在C#中执行此操作,并想知道如何格式化要作为JSON传递给服务器的值数组.
目前我有这个:
new {name = "command" , index = "X", optional = "0"}
这在JSON中转换为:
"name": "command",
"index": "X",
"optional": "0"
Run Code Online (Sandbox Code Playgroud)
我想创建一个名为items的数组,其中每个元素都包含这三个值.所以它本质上是一个对象数组,其中对象包含名称,索引和可选字段.
我的猜测是,这将是这样的:
new {items = [(name = "command" , index = "X", optional = "0"),
(name = "status" , index = "X", optional = "0")]}
Run Code Online (Sandbox Code Playgroud)
如果它是正确的语法,将在JSON中转换为this:
"items":
[
{
"name": "command",
"index": "X",
"optional": "0"
},
{
"name": "status",
"index": "X",
"optional": "0"
}
]
Run Code Online (Sandbox Code Playgroud)
但是,显然我做错了.想法?任何帮助表示赞赏.
创建一个新的MVC项目,并喜欢数据层中的存储库的想法,所以我已经实现了它们.我还创建了一个Service层来处理所有业务逻辑和验证,该层依次使用适当的存储库.像这样的东西(我使用Simple Injector注入)
DAL LAYER
public class MyRepository {
private DbContext _context;
public MyRepository(DbContext context) {
_context = context;
}
public MyEntity Get(int id)
{
return _context.Set<MyEntity>().Find(id);
}
public TEntity Add(MyEntity t)
{
_context.Set<MyEntity>().Add(t);
_context.SaveChanges();
return t;
}
public TEntity Update(MyEntity updated, int key)
{
if (updated == null)
return null;
MyEntity existing = _context.Set<MyEntity>().Find(key);
if (existing != null)
{
_context.Entry(existing).CurrentValues.SetValues(updated);
_context.SaveChanges();
}
return existing;
}
public void Delete(MyEntity t)
{
_context.Set<MyEntity>().Remove(t);
_context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
服务层
public class MyService {
private …Run Code Online (Sandbox Code Playgroud) 我有一个IEnumerable对象.我想基于索引访问例如:
for(i=0; i<=Model.Products; i++)
{
???
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我是javascript的新手,我读到了模块模式以提供某种命名空间并拥有私有和公共成员,例如:
var module = (function() {
var s = "Hello, i'm private and in closure!";
return {
myString : s,
myFunc: function() { alert(s); }
};
})();
Run Code Online (Sandbox Code Playgroud)
我确实看到了它的好处,因为它为您提供了面向对象编程的一些优点.但是我已经看到很多没有分配给变量的IIFE的例子.与你调用的普通函数相比,这(就我所见)没有任何优势:
(function() {
var s = "Hello I'm private!";
$('#myButton').on('click', function() {
alert(s);
});
})();
Run Code Online (Sandbox Code Playgroud)
function Initialize() {
var s = "Hello I'm private!";
$('#myButton').on('click', function() {
alert(s);
});
}
Initialize();
Run Code Online (Sandbox Code Playgroud)
它们都有私有变量,可以避免创建全局变量,并且它们都可以在不向变量返回任何值的情况下执行.虽然第二个让你可以选择一个好名字,而不是一个没有名字的潜在大型IIFE,让读者知道发生了什么.我到处看到的答案是"避免命名空间污染"但两种方法都是这样做的,第一种方法有点难以理解?
简而言之:
使用IIFE比我缺少的正常功能有什么好处?我为什么要用它们?
我有一个使用Entity Framework 6进行一些数据库操作的DLL.我正在使用数据库第一种方法.关于实体框架的模型和所有内容,如App.config中的连接字符串,都是通过Visual Studio中的wizzard创建的.
所以我编译了dll并将其与相应的.config放在使用dll的应用程序所期望的文件夹中.
一切正常,直到我达到实际数据库调用的程度.我收到错误:
找不到MyDatabaseEntity的连接字符串
正如我所说,自动生成的连接字符串是在dll的配置文件中.我无法更改应用程序的App.config.但是应用程序移交了一个对象,该对象具有我自己构建连接字符串所需的所有信息.所以我正在寻找一种在不依赖配置文件的情况下在代码中设置连接字符串的方法.我找到的数据库第一种方法的所有教程都使用这种方法.我在这里发现了一条帖子,说明在创建Object时简单地将连接字符串作为参数
MyDatabaseEntities = new MyDatabaseEntities(dbConnect);
Run Code Online (Sandbox Code Playgroud)
但'MyDatabaseEntities'没有带任何参数的构造函数
public partial class MyDatabaseEntities : DbContext
{
public MyDatabaseEntities()
: base("name=MyDatabaseEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<MyTable> MyTable { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读Eric Lippert撰写的博客,他解释了为什么他几乎从不使用数组,以下部分让我很好奇:
如果您正在编写这样的API,请将数组包装在ReadOnlyCollection中并返回IEnumerable或IList或其他内容,但不返回数组. (当然,不要简单地将数组转换为IEnumerable并认为你已经完成了!那仍然是传递变量;调用者可以简单地转换回数组! 只有在读取数据时才传递出一个数组 -唯一的对象.)
所以我在收藏中乱七八糟:
string[] array = new[] { "cat", "dog", "parrot" };
IEnumerable<string> test1 = array.AsEnumerable();
string[] secondArray = (string[])test1;
//array1[0] is now also "whale"
array[0] = "whale";
//11 interfaces
var iArray = array.GetType().GetInterfaces();
//Still 11 interfaces??
var iTest1 = test1.GetType().GetInterfaces();
Run Code Online (Sandbox Code Playgroud)
我初始化数组,然后使用该AsEnumerable()方法就可以将其转换为一个IEnumerable(或因此我认为),但是当我将它转换回一个新的阵列,和原来的数组中改变一个值,值test1,并secondArray得到了改变,以.显然我只是对原始数组进行了2次新引用,而不是创建一个IEnumerable像ToArray()返回一个新数组的新引用.
当我比较数组的接口时IEnumerable,它们都具有相同的接口.如果数组实际上没有做任何事情,为什么数组有这个方法呢?我知道AsEnumerable()它有用Linq-to-entities来获取可枚举的方法IQueryable,但是为什么要将这个方法添加到数组中呢?这种方法有实际用途吗?
编辑: Tim Schmelter的评论提出了一个非常好的观点,不应该被忽视:
"它没有那么无用.你可以在不破坏其余代码的情况下改变实际类型.所以你可以用数据库查询或列表或hashset或其他任何东西替换数组,但是AsEnumerable总是有效,其余的代码也是如此所以AsEnumerable就像一份契约."
c# ×7
.net ×2
abstraction ×1
asp.net-mvc ×1
asynchronous ×1
collections ×1
dll ×1
git ×1
github ×1
github-api ×1
ienumerable ×1
interface ×1
javascript ×1
json ×1
linq ×1
release ×1
schema ×1
theory ×1
unit-of-work ×1