从我Web API使用generic-repository/uow模式的服务开始EF6,我需要返回嵌套的导航属性.模型A具有模型B,模型B具有模型C等.像这样的东西:
public class A
{
public int SomeID { get; set; }
public ICollection<B> Bs { get; set; }
}
public class B
{
public int SomeID { get; set; }
public ICollection<C> Cs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我可以在A中获得B,但是B中的C是空的.这就是我这样做的方式:
// GENERIC REPOSITORY
public IQueryable<TEntity> Get(params Expression<Func<TEntity, object>>[] includes)
{
IQueryable<TEntity> query = _dbSet;
if (includes != null)
{
foreach (var include in includes)
query = query.Include(include);
}
return query;
}
// FROM THE "A" …Run Code Online (Sandbox Code Playgroud) c# entity-framework unit-of-work repository-pattern asp.net-web-api
在这种情况下,Employee和/或Illness实例是否是线程安全的?每个线程都有自己的对象副本吗?最初我认为每个线程都有自己的副本,但现在我不确定.
Parallel.ForEach(line01s, _options, o =>
{
var employee = new Employee();
// set values on employee...Safe?
var illness = new Illness();
// set values on illness...Safe?
employee.AddIllness(illness); // Illness is a property on Employee
}
Run Code Online (Sandbox Code Playgroud)
是否可以在错误的Employee对象上设置Illness对象?我是否需要在employee.AddIllness(疾病)周围添加锁定; ?我使用这个TPL的东西越多,我发现我就越不理解
我收到一个非常大的列表作为方法参数,并希望在使用它后从内存中删除它.通常我会让GC做它的事情,但我需要非常小心这个应用程序中的内存使用.
这段代码会实现我的目标吗?我读过很多不同意见,很困惑.
public void Save(IList<Employee> employees)
{
// I've mapped the passed-in list
var data = Mapper<Employee, EmployeeDTO>.MapList(employees);
// ?????????????
employees = null;
GC.Collect();
// Continues to process very long running methods....
// I don't want this large list to stay in memory
}
Run Code Online (Sandbox Code Playgroud)
也许我应该使用另一种我不知道的技术?
我无法将此代码转到页面.表的页面大小始终相同 - 从Web API调用返回的项目数.传入的参数被忽略(3).此外,后退和前进按钮元素没有图标(图标 - 后退和图标 - 前进 - 后退),但这是页面大小的次要.
HTML
<table class="table">
<thead>
<tr>
<th data-column="LastName">Last Name</th>
<th data-column="FirstName">First Name</th>
<th data-column="EnrollmentDate">Enrollment Date</th>
</tr>
</thead>
<tbody data-bind="foreach: students">
<tr>
<td data-bind="text: LastName" />
<td data-bind="text: FirstName" />
<td data-bind="text: EnrollmentDate" />
</tr>
</tbody>
<tfoot>
<tr>
<td>
Number of items per page:
<select id="pageSizeSelector" data-bind="value: pageSize">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option> …Run Code Online (Sandbox Code Playgroud) 我刚刚遇到这个代码.我立即开始畏缩和自言自语(不是好事).事情是我不明白为什么,也不能合理地阐明它.它对我来说真的很糟糕 - 也许我错了.
public async Task<IHttpActionResult> ProcessAsync()
{
var userName = Username.LogonName(User.Identity.Name);
var user = await _user.GetUserAsync(userName);
ThreadPool.QueueUserWorkItem((arg) =>
{
Task.Run(() => _billing.ProcessAsync(user)).Wait();
});
return Ok();
}
Run Code Online (Sandbox Code Playgroud)
这段代码让我觉得它不必要地用ThreadPool.QueueUserWorkItem和创建线程Task.Run.此外,它看起来有可能在重负载时出现死锁或造成严重的资源问题.我对么?
_billing.ProcessAsync()方法是等待的(异步),所以我希望一个简单的"await"关键字是正确的,而不是所有这些其他的包袱.
在继续执行之前如何等待上一个方法完成?我觉得这很容易,但事实并非如此.即使我已经阅读了很多例子,我也必须做一些非常愚蠢的事情.在下面的代码中,我不能让GetDocVM()方法执行,直到AddUserDocuments()方法完成.为什么?因为GetDocVM() 不会引入刚刚添加的记录.我继承了这段代码,并试图改进它.
ut.ModelJSON = await Task.Run(() => _userTransactionService.ConvertToModelJson(typeof(UserDocument).Name, "", transactionDocs)).ConfigureAwait(false);
var taskReturnsVoid = Task.Run(() => _genericUploadService.AddUserDocuments(ut, docs));
List<GenericUploadDocumentViewModel> viewModel = new List<GenericUploadDocumentViewModel>();
await taskReturnsVoid.ContinueWith((t) =>
{
viewModel = GetDocVM();//I EXPECTED THIS TO WAIT TO BE EXECUTED
});
return Json(viewModel, JsonRequestBehavior.AllowGet); //GETTING HERE TOO SOON
Run Code Online (Sandbox Code Playgroud)