我想知道哪个是从大型数据库查询数据的最佳方法.
假设我需要获取所有居住在美国的用户的列表,以及他们的订单和属于他们订单的产品.为简单起见,我们有一个user表,其中有一个CountryId表...然后是一个Order表,带有userId..然后可能是一个OrderProduct表,列出许多产品到订单(许多订单可以包含相同的产品).
我的问题是,或许可以通过创建临时表来更好
SELECT userId FROM dbo.User WHERE countrId = @CountryId
Run Code Online (Sandbox Code Playgroud)
我们现在在临时表中有相关用户.
然后,做一个
Select p.ProductDescription ...
From @TempTable tmp
INNER JOIN Order o
ON o.UserId = tmp.UserId
INNER JOIN OrderProduct op
ON op.OrderID = o.OrderId
INNER JOIN Product p
ON p.ProductId = op.ProductId
Run Code Online (Sandbox Code Playgroud)
所以,我正在做的是获取我需要的用户....并将其移动到临时表中,然后使用该临时表来过滤主查询的数据.
或者,它是否有效,如果不是更多,只需一个人做到这一点......
Select ... from User u
INNER JOIN Order o
....
WHERE u.UserId = @UserId
Run Code Online (Sandbox Code Playgroud)
?
我们在一个来自 VB6 的旧项目上运行了一个转换工具。
我们用 Ado.Net 代替 OLEDB,用 SqlDataReaders 代替 RecordSet。
但转换后的代码总是会进行rs.Fields['FirstName']引用,我猜这将是rs['FirstName']数据库读取器的引用(其中 rs 现在是 q SqlDataReader.
有没有办法可以在 SqlDataReader 上创建一个扩展方法,然后使用“ Fields['FieldName']”,而不是遍历所有代码?
这是我目前的尝试:
public static class SqlUtils
{
public static object Fields(this SqlDataReader dataReader, string fieldname)
{
return dataReader[fieldname];
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这适用于:
Console.WriteLine(reader.Fields("First").ToString());
Run Code Online (Sandbox Code Playgroud)
我需要处理:
Console.WriteLine(reader.Fields["First"].ToString());
Run Code Online (Sandbox Code Playgroud)
注意,是[],不是()。
目前,我从SQL serve r(2008)数据库中获取数据.cyurrent方法是使用DataTable,然后传递并使用它.
if (parameters != null)
{
SqlDataAdapter _dataAdapter = new SqlDataAdapter(SqlQuery, CreateFORSConnection());
foreach (var param in parameters)
{
_dataAdapter.SelectCommand.Parameters.AddWithValue(param.Name, param.Value);
}
DataTable ExtractedData = new DataTable(TableName);
_dataAdapter.Fill(ExtractedData);
return ExtractedData;
}
return null;
Run Code Online (Sandbox Code Playgroud)
但是现在,用户已经说过我们也可以从txt文件中获取数据,这些文件与SQL Server中的表具有相同的结构.所以,如果我有一个名为'Customer'的表,那么我有一个带有Customer的csv文件.具有相同的列结构.CSV中的第一行是列名,并匹配我的表.
是否可以将txt文件读入数据表,然后以某种方式在该数据表上运行SELECT?我的大多数查询都是单表查询:
SELECT * FROM Table WHERE Code = 111
Run Code Online (Sandbox Code Playgroud)
但是,有一个案例我会加入.这可能有点棘手,但我可以制定一个计划.如果我可以先将txt文件放到数据表中,我可以使用它.
使用上面的代码,我是否可以不将连接字符串更改为从CSV而不是SQL Server读取?
我对MVC非常陌生,但我正在与一个可能非常基本和明显的问题作斗争.
在我的HomeController上,我有:
[HttpGet]
public ViewResult Index()
{
int hour = DateTime.Now.Hour;
var reply = User.Identity.IsAuthenticated ? User.Identity.Name + " is Logged in!" : hour < 12 ? "Good morning" : "Good afternoon";
ViewBag.Greeting = reply;
return View();
}
Run Code Online (Sandbox Code Playgroud)
当我启动我的应用程序时,此代码运行.
该页面作为登录屏幕的链接.
<div>
@Html.ActionLink("Login", "ShowLoginScreen")
</div>
Run Code Online (Sandbox Code Playgroud)
页面加载,用户登录.
加载登录cshtml文件,用户输入用户名/密码:
<body>
@using (Html.BeginForm())
{
@Html.ValidationSummary()
<p>Username: @Html.TextBoxFor(x=>x.Username)</p>
<p>Password: @Html.TextBoxFor(x=>x.Password)</p>
<p><input type="submit" value="Login"/></p>
}
</body>
Run Code Online (Sandbox Code Playgroud)
单击Login时,它会调用HomeController中的方法:
[HttpPost]
public ActionResult ShowLoginScreen(Login login)
{
if (ModelState.IsValid)
{
var reply = new BasicFinanceService.UserService().Authenticate(login.Username,
Security.EncryptText(login.Password));
if(reply.Id != 0)
FormsAuthentication.SetAuthCookie(reply.Username, …Run Code Online (Sandbox Code Playgroud) 我们正处于.Net的中型/大型应用程序的早期设计阶段,对于一个系统内部有三个不同的客户端(站点)(一个在一个单独的域中)连接,以及很多外部服务.
我们现在专注于连接的内部站点,我正在提出一个经典的分层应用程序,包括接口层,服务层,业务逻辑层和数据访问层.
在图像中,我们有一个连接到MVC应用程序的浏览器.控制器具有对服务项目的引用(可能具有每个"业务区域"的类.例如,"PersonService").MVC将直接引用此服务项目.在服务层中,还会有一些WCF项目,将某些功能暴露给外部源,其他内部站点和服务等.
但是,WCF项目将连接到主服务DLL以从中获取共享功能.
然后,Service项目直接引用Business项目,其中包含所有业务逻辑.然后它引用了数据访问项目,该项目具有/某些实体框架模型作为SQL Server数据库的ORM.
SharedLib只是一个所有层引用的项目,包含任何共享逻辑,但主要用于DTO(数据传输对象).EF模型被转换为数据层中的DTO,因为没有其他层参考EF模型.
但MVC应用程序,通过应用程序内的直接引用连接到服务层,以及将WCF服务暴露给外部源和跨域内部站点.
我们遇到的问题是服务层.我认为这应该是一个DLL,其他人说,如果没有WCF,那么表示应该直接连接到业务逻辑层.他们问,'为什么在这里添加服务DLL的额外层和复杂性?'.
消除表示"可以"直接连接到逻辑的服务层是一种好习惯吗?我看到服务层的好处是增加了业务和表示的明确隔离,允许扩展.它看起来像是通过dll,但直接连接到BL看起来很奇怪.
是否有使用DLL的pro/con有理由保持/不保留它?
我目前在我的MVC项目中手动执行DTO => ViewModel转换.所以,代码看起来像这样:
var model = new LandingModel {
FamilyName = token.FamilyName,
LoggedInUser = token.DisplayName,
TimeZoneName = token.TimeZoneName,
CurrentDateTime = Common.SessionManager.GetSessionDate().ToString(SharedLib.Constants.FMT_DATE_AND_TIME_LONG)
};
Run Code Online (Sandbox Code Playgroud)
LandingModel看起来像这样:
public class LandingModel
{
public string FamilyName { get; set; }
public string LoggedInUser { get; set; }
public string TimeZoneName { get; set; }
public string CurrentDateTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我如何处理CurrentDateTime?它是模型中的一个字符串,通过从会话变量获取用户时区日期时间并应用字符串格式来处理.
我怎么能这样做呢 Mapper.Map<SessionToken>(model));
注意,.GetSessionDate()只需要采用UTC日期,并添加用户时区的偏移量,以根据它们提供当前日期.
我试图学习如何使用await和async.
我有一个服务层,它有一个参考数据管理器.我的界面是:
public interface IReferenceDataService
{
Task<List<ReferenceItemDto>> GetAsync(ReferenceTypes type);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在UI中获取数据时,我这样做:
model.DeptPaymentTypes = _refDataService.GetAsync(Enums.ReferenceTypes.DeptPaymentTypes)
.Select(x => new SelectListItem {
Text = x.Description,
Value = x.Id.ToString() })
.ToList();
Run Code Online (Sandbox Code Playgroud)
但是我得到一个错误,"ToList不是Task <...的定义"
我的数据层调用使用Dapper QueryAsync获取数据...
public async Task<List<ReferenceItemDto>> GetAsync(Enums.ReferenceTypes type)
{
var table = string.Empty;
if(type == Enums.ReferenceTypes.DaysOfMonth)
{
var days = new List<ReferenceItemDto>();
for (int i = 1; i <= 31; i++)
{
days.Add(new ReferenceItemDto
{
Description = i.ToString(),
Id = i
});
}
return days;
}
switch (type)
{
case Enums.ReferenceTypes.SnowballTypes:
table …Run Code Online (Sandbox Code Playgroud) 有人可以向我解释为什么我会为此收到设计/编译时错误。
我试图根据最后更新日期或创建日期获取每个表的最后一个 Guid。
var accountId = context.Account.OrderBy(x => x.LastUpdateDate).ThenBy(x=>x.LastUpdateDate).FirstOrDefaultAsync(x => x.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
var transactionLineId = context.TransactionLine.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.Transaction.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
var transactionId = context.Transaction.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
var budgetId = context.Budget.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
var scheduleId = context.Schedule.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
Run Code Online (Sandbox Code Playgroud)
然后,等待每个响应并传递给一个方法。
var guids = new List<Guid> { await accountId, await transactionLineId, await transactionId, await budgetId, await scheduleId };
var …Run Code Online (Sandbox Code Playgroud) 我正在使用 react-bootstrap,并且有一个带有插入符号的按钮,可以触发下拉列表。
但是我需要使用垂直的 3 个点,而不是按钮样式。
我有一个对三个点使用 CSS 类的跨度,但似乎无法找到摆脱按钮和插入符号的方法。
我现在最紧张的是:
<Dropdown>
<Dropdown.Toggle>
<span className="threedots"></span>
</Dropdown.Toggle>
<Dropdown.Menu size="sm" title="">
<Dropdown.Header>Options</Dropdown.Header>
<Dropdown.Item .... ></Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
Run Code Online (Sandbox Code Playgroud)
我只想看到三个点(我将添加鼠标悬停效果)。有没有办法使用快照作为切换>
我正在成功连接我的新 Cosmos DB。
private async Task InitialiseDb()
{
client = new CosmosClient(cosmosUrl, cosmosKey);
database = await client.CreateDatabaseIfNotExistsAsync(databaseName);
container = await database.CreateContainerIfNotExistsAsync("MyContainer", "/id");
}
Run Code Online (Sandbox Code Playgroud)
然后,我设法将一个项目填充到我的 Cosmos 实例中。
var response = await container.CreateItemAsync(myDocument);
Run Code Online (Sandbox Code Playgroud)
当登录到 Azure 并查看我的项目时,我看到了该项目。所以就保存下来了。
现在我试图取回该项目,但收到有关 的错误not found。
Microsoft.Azure.Cosmos.CosmosException :响应状态代码不指示成功:NotFound (404);子状态:0;活动ID:e90da49c-510e-4940-a888-9531427a3810;原因:(错误:[“未找到资源。了解更多信息:https://aka.ms/cosmosdb-tsg-not-found”]);
我获取该物品的方法非常简单:
public async Task<MyDto> GetRecord(Guid myId)
{
var data = await container.ReadItemAsync<FlightDoc>(myId.ToString(), new PartitionKey("id"));
return new MyDto
{
Id = Guid.Parse(data.Resource.id)
};
}
Run Code Online (Sandbox Code Playgroud)
我认为我误解了分区及其工作原理。有什么明显不对的地方吗?这是我的数据浏览器的部分屏幕截图:
我正在传递上面 ID 中显示的 ID。
编辑:更好地解释数据。这次飞行,收集了很多样品。一个航班有很多样本...每个样本都有一个 ID。但我正在努力带回 Flgith 和样本。
c# ×7
asynchronous ×2
sql ×2
.net ×1
architecture ×1
asp.net-mvc ×1
async-await ×1
automapper ×1
azure ×1
css ×1
dapper ×1
datatable ×1
dll ×1
reactjs ×1
sql-server ×1
wcf ×1