正如标题所示,我正在寻找一种方法来将where子句与include结合使用.
这是我的情况:我负责支持一个充满代码味道的大型应用程序.更改过多代码会导致各处出现错误,因此我正在寻找最安全的解决方案.
假设我有一个对象总线和一个对象People(Bus有一个导航道具Collection of People).在我的查询中,我需要选择只有醒着的乘客的所有公共汽车.这是一个简单的虚拟示例
在当前的代码中:
var busses = Context.Busses.Where(b=>b.IsDriving == true);
foreach(var bus in busses)
{
var passengers = Context.People.Where(p=>p.BusId == bus.Id && p.Awake == true);
foreach(var person in passengers)
{
bus.Passengers.Add(person);
}
}
Run Code Online (Sandbox Code Playgroud)
在此代码之后,处理Context,并且在调用方法中,生成的Bus实体被映射到DTO类(实体的100%副本).
此代码导致多次调用DB,这是一个禁止,所以我在MSDN博客上找到了这个解决方案
这在调试结果时效果很好,但是当实体映射到DTO时(使用AutoMapper),我得到一个异常,即Context/Connection已经关闭并且无法加载该对象.(上下文总是关闭不能改变这个:()
所以我需要确保已经加载了Selected Passengers(导航属性上的IsLoaded也是False).如果我检查Passengers集合,Count也会抛出Exception,但是在Passegers集合中还有一个名为"包装相关实体"的集合,其中包含我的过滤对象.
有没有办法将这些包装的相关实体加载到整个集合中?(我无法更改automapper mapping配置,因为它在整个应用程序中使用).
有没有其他方式来获得活跃的乘客?
任何提示都是受欢迎的......
Gert Arnold的答案不起作用,因为数据未被急切加载.但是当我简化它并删除它的加载位置时.这真是奇怪,因为执行sql在两种情况下都返回所有乘客.因此,将结果放回实体时一定存在问题.
Context.Configuration.LazyLoadingEnabled = false;
var buses = Context.Busses.Where(b => b.IsDriving)
.Select(b => new
{
b,
Passengers = b.Passengers
})
.ToList()
.Select(x => x.b)
.ToList();
Run Code Online (Sandbox Code Playgroud)
经过很多努力,格特阿诺德的答案奏效了!正如Gert Arnold建议您需要禁用延迟加载并将其保持关闭状态.这将要求对应用程序进行一些额外的更改,因为上一代开发人员喜欢Lazy Loading -_-
我创建了自己的私人角度库,其中包含多个组件,让我的生活更轻松。我按照本教程制作了这个库。一切都很好,我什至将它添加到另一个项目中进行测试。
现在是我必须支持多种语言的部分,因为我住在比利时。我过去使用过 ngx-translate 包没有任何问题,所以我认为这很容易。
我在我的项目中添加了一个带有翻译 json 的 assets/i18n 文件夹。
我发现 angular cli 不包含构建时的资产,因此您必须在制作包之前手动或使用 gulp 将它们添加到 dist 文件夹中。这样做之后,我注意到标签没有被翻译,除非我将翻译包含在主应用程序的 json 文件中。
我的库中的每个组件都有自己的模块,所以我认为我只需要在这些模块中添加翻译模块。所以我做了以下事情。
export function httpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}
@NgModule({
imports: [
CommonModule,
FormsModule,
DirectivesModule,
ButtonModule,
IconModule,
PillModule,
TranslateModule.forChild({
loader: {
provide: TranslateLoader,
useFactory: (httpLoaderFactory),
deps: [HttpClient]
},
isolate: true
})
],
declarations: [
FilterComponent
],
exports: [
FilterComponent
]
})Run Code Online (Sandbox Code Playgroud)
这让事情变得更糟,不仅标签仍未被翻译,我的主要应用程序甚至没有使用自己的翻译。在库模块中的这些更改之前,主应用程序的翻译没有问题......
所以是的,你猜对了,我被卡住了......我似乎找不到正确的解决方案。
我使用散列密码和salt(用户名).
问题是c#的散列值不等于我通过TSQL脚本添加到数据库的初始值.
TSQL:
UPDATE [Users]
SET Password = HASHBYTES('SHA2_256', 'test123'+UPPER([UserName]))
GO;
Run Code Online (Sandbox Code Playgroud)
C#:
var passBytes = new UnicodeEncoding().GetBytes(pass);
var saltBytes = new UnicodeEncoding().GetBytes(userName.ToUpper());
var dataToHash = new byte[passBytes.Length + saltBytes.Length];
Array.Copy(passBytes, dataToHash, passBytes.Length);
Array.Copy(saltBytes, dataToHash, saltBytes.Length);
var sha = new SHA256Managed();
return sha.ComputeHash(dataToHash);
Run Code Online (Sandbox Code Playgroud)
我想这与编码有关.但我不知道如何解决这个问题.
UserName是varchar(50)
DB是现有的,因此更改varchar并不容易.
我已经尝试过:
UPDATE [Users]
SET Password = HASHBYTES('SHA2_256', N'test123'+UPPER([UserName]))
GO;
Run Code Online (Sandbox Code Playgroud) 我知道这是最常见的问题之一.我有解决方案,但我目前的项目让我疯了.我使用完全相同的代码,但结果仍然不同.
这是我通常用来格式化日期的代码:
@Html.TextBoxFor(m => m.DateOfAgenda, "{0:dd/MM/yyyy}")
Run Code Online (Sandbox Code Playgroud)
通常这应该导致07/10/2014但由于某种原因它导致07-10-2014当我在另一个项目中测试时,上面的代码按预期工作.
作为测试,我比较了以下几行的结果:
@Html.TextBoxFor(m => m.DateOfAgenda, "{0:dd/MM/yyyy}")
/* result: 07-10-2014*/
@Html.TextBoxFor(m => m.DateOfAgenda)
/* result: 7-10-2014 00:00:00*/
Run Code Online (Sandbox Code Playgroud)
所以我的代码似乎部分工作只有' - '不会被'/'取代有人知道如何一劳永逸地处理这个问题吗?
我有自定义代码设置文化.它使用路由将其设置为特定的文化(默认为'nl')当我将下面的代码放在注释中时,一切似乎都有效.但我需要这部分来加载我的资源(标签文本,错误,......).
var language = handler.RequestContext.RouteData.Values["language"];
if (language != null)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(language.ToString());
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(language.ToString());
}
Run Code Online (Sandbox Code Playgroud)
更具体地说,这一行打破了格式
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(language.ToString());
Run Code Online (Sandbox Code Playgroud)
有人知道为什么吗?我希望它{0:dd/MM/yyyy}具有优先权,因为它是明确设置的.有趣的是,/它只是被翻译成了-.当我使用{0:dd//MM//yyyy}它时结果19--10--2014.
很抱歉我迟到了,但我找不到时间尝试这个.所以基本上问题是文化和我的格式设置.
@Html.TextBoxFor(m => m.DateOfAgenda, "{0:dd/MM/yyyy}")
Run Code Online (Sandbox Code Playgroud)
'/'仍会被您的文化指定的分隔符取代.我的文化被设置为'nl',但默认情况下会产生'nl-nl',他们使用' - '作为日期分隔符.我住在比利时'nl-be',在这里我们使用'/'.可以设置我的文化或改变格式.下面的代码完成了诀窍.
@Html.TextBoxFor(m => m.DateOfAgenda, "{0:dd'/'MM'/'yyyy}")
Run Code Online (Sandbox Code Playgroud) 我正在创建一个自定义角度组件,当我的 FormControl(反应式表单)无效时,它会显示错误工具提示。但我不知道如何访问自定义组件中的 FormControl 以检查它是否被标记为有效。
我想要完成的
<div [formGroup]="form">
<input formControlName="name" type="text" />
<custom-validation-message formControlName="name">My special error message!</custom-validation-message>
</div>Run Code Online (Sandbox Code Playgroud)
已经遇到的东西
错误错误:没有名称的表单控件的值访问器:'surveyType'
通过使用 NG_VALUE_ACCESSOR 实现 ControlValueAccessor 来修复此问题,即使我不想更改该值。我还添加了一个注入器来访问 NgControl。
import { Component, OnInit, Injector } from '@angular/core';
import { NgControl, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
@Component({
selector: 'custom-validation-message',
templateUrl: './validation-message.component.html',
providers: [{
provide: NG_VALUE_ACCESSOR, multi: true, useExisting: ValidationMessageComponent
}]
})
export class ValidationMessageComponent implements ControlValueAccessor, OnInit {
public formControl: any;
constructor(private injector: Injector) {
super();
}
public ngOnInit(): void {
const model = this.injector.get(NgControl); …Run Code Online (Sandbox Code Playgroud)c# ×3
angular ×2
asp.net-mvc ×1
encoding ×1
hash ×1
include ×1
sql-server ×1
t-sql ×1
where-clause ×1