小编Bee*_*jee的帖子

EF:包含where子句

正如标题所示,我正在寻找一种方法来将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)

EDIT2

经过很多努力,格特阿诺德的答案奏效了!正如Gert Arnold建议您需要禁用延迟加载并将其保持关闭状态.这将要求对应用程序进行一些额外的更改,因为上一代开发人员喜欢Lazy Loading -_-

c# entity-framework include where-clause

45
推荐指数
3
解决办法
5万
查看次数

带有 ngx-translate 的自定义 Angular 库

我创建了自己的私人角度库,其中包含多个组件,让我的生活更轻松。我按照本教程制作了这个库。一切都很好,我什至将它添加到另一个项目中进行测试。

现在是我必须支持多种语言的部分,因为我住在比利时。我过去使用过 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)

这让事情变得更糟,不仅标签仍未被翻译,我的主要应用程序甚至没有使用自己的翻译。在库模块中的这些更改之前,主应用程序的翻译没有问题......

所以是的,你猜对了,我被卡住了......我似乎找不到正确的解决方案。

internationalization ngx-translate angular angular-library

10
推荐指数
1
解决办法
8574
查看次数

C#Hash SHA256Managed不等于TSQL SHA2_256

我使用散列密码和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)

c# t-sql sql-server hash encoding

8
推荐指数
3
解决办法
4879
查看次数

DateTime的文本框格式错误

我知道这是最常见的问题之一.我有解决方案,但我目前的项目让我疯了.我使用完全相同的代码,但结果仍然不同.

这是我通常用来格式化日期的代码:

@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)

c# asp.net-mvc datetime-format

7
推荐指数
1
解决办法
2225
查看次数

在自定义 Angular 组件中访问 FormControl

我正在创建一个自定义角度组件,当我的 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)

angular-components angular angular-reactive-forms

6
推荐指数
1
解决办法
4781
查看次数