小编Ant*_*ony的帖子

将LINQ表达式传递给另一个QueryProvider

我有一个简单的自定义QueryProvider,它接受一个表达式,将其转换为SQL并查询sql数据库.

我想在QueryProvider中创建一个小缓存来存储常用对象,这样就可以在没有数据库命中的情况下进行检索.

QueryProvider具有该方法

public object Execute(System.Linq.Expressions.Expression expression)
{
    /// Builds an SQL statement from the expression, 
    /// executes it and returns matching objects
}
Run Code Online (Sandbox Code Playgroud)

缓存作为此QueryProvider类中的字段而存在,并且是一个简单的通用List.

如果我使用List.AsQueryable方法并将上面的表达式传递给List.AsQueryable的Provider的Execute方法,它就不能按预期工作.看起来当表达式被编译时,初始QueryProvider成为一个不可或缺的部分.

是否可以将表达式传递给后续的QueryProvider并根据需要执行表达式?

调用代码看起来模糊如下:

public class QueryProvider<Entity>()
{
    private List<TEntity> cache = new List<Entity>();

    public object Execute(System.Linq.Expressions.Expression expression)
    {
        /// check whether expression expects single or multiple result
        bool isSingle = true;

        if (isSingle)
        {
            var result = this.cache.AsQueryable<Entity>().Provider.Execute(expression);
            if (result != null) 
                return result;
        }

        /// cache failed, hit database
        var qt = new QueryTranslator(); …
Run Code Online (Sandbox Code Playgroud)

c# linq linq-expressions

13
推荐指数
1
解决办法
2840
查看次数

MVC授权属性+ HttpUnauthorizedResult + FormsAuthentication

在CodePlex上浏览MVC部分后,我注意到MVC中的[Authorize]属性在授权失败时返回一个HttpUnauthorizedResult()(codeplex AuthorizeAttribute类).

在来自CodePlex的HttpUnauthorizedResult()源代码中(我不允许输入另一个URL,因为我的代表不够高,但用22929#266476替换上面URL上的数字):

// 401 is the HTTP status code for unauthorized access - setting this
// will cause the active authentication module to execute its default
// unauthorized handler
context.HttpContext.Response.StatusCode = 401;
Run Code Online (Sandbox Code Playgroud)

特别是,注释描述了身份验证模块的默认未授权处理程序.

我似乎无法找到有关此默认未经授权的处理程序的任何信息.特别是,我没有使用FormsAuthentication,当授权失败时,我得到一个丑陋的IIS 401错误页面.

有没有人知道这个默认的未经授权的处理程序,特别是FormsAuthentication如何挂钩自己来覆盖它?

我正在为我的足球队写一个非常简单的应用程序,他确认或否认他们是否可以进行特定比赛.如果我在web.config中启用FormsAuthentication,重定向工作,但我没有使用FormsAuthentication,我想知道是否有解决方法.

asp.net-mvc forms-authentication

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

将OrderBy表达式与Where表达式结合起来

我找到了以下可以组合多个Expression<Func<T,bool>>表达式的问题:

如何在没有调用的情况下合并两个C#Lambda表达式?

我想知道,使用类似的技术,你是如何将.OrderBy Expression<Func<Entity, Key>>与.Where 合并Expression<Func<Entity, bool>>为一个类型的表达式,或继承类型,System.Linq.Expressions.Expression.

我正在做一个真正的削减QueryProvider风格类采取T => T == ...Func键的通过公共的方法.Where.OrderBy.这是为了将此类构建的表达式传递给QueryTranslator以创建合适的SQL.

从QueryProvider调用时,此样式的QueryTranslator通常将一个System.Linq.Expressions.Expression作为参数,然后转换为SQL.

我可以通过并理解上面的问题来合并两个.WhereFunc.以下博客文章对此特别有用,我追溯了每个示例:

http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx

此CodeProject文章也很有用:

http://www.codeproject.com/Articles/24255/Exploring-Lambda-Expression-in-C

将.OrderBy Func与.Where Func组合时,两者具有不同的泛型参数.在.的情况下,它是一个Func<Entity, bool>,而在.OrderBy的情况下,它是一个Func<Entity, Key>.

从表面上看,合并这两个表达式并不像使用相同的泛型参数合并两个表达式那样简单.

内置的Func-Expression生成引擎(不确定术语)能够将.Where Func与.OrderBy Func结合起来.当这两个表达式合并成一个时,我很好奇发生了什么System.Linq.Expressions.Expression.是否有可能,如果是这样,你将如何去结合的Expression<Func<Entity, bool>>Expression<Func<Entity,Key>>假设的实体是在每个表达式相同类型的?

c# linq expression linq-expressions

5
推荐指数
1
解决办法
1449
查看次数

在浏览器中显示已编辑的.cshtml视图更改之前,Kestrel / IIS Express需要重新启动

我正在设置我的第一个ASP.NET vNext Web应用程序项目。

我已经尽力让默认项目在Windows和OSX中都能正常构建和运行。我已经在Mac和Windows IIS Express中与Kestrel一起在Kestrel上进行了测试。

我遇到的问题是,在Windows中,当我下次刷新浏览器时,没有反映在Web服务器运行时编辑cshtml View文件。

  • 在OSX中,我可以运行“ dnx web”并导航到localhost:5000并浏览该站点。然后,我可以编辑.cshtml视图文件,切换回浏览器,单击“刷新”,然后可以看到所有更改。这是我期望在以前的版本中发生和发生的事情。*

  • 在Windows中,我可以在与OSX相同的站点上运行dnx web或IIS Express,导航到localhost:5000(或IIS Express自己的端口号)并浏览该站点。然后,我切换到编辑cshtml View文件,但是当我切换回浏览器进行重置时,未显示更改。直到我重新启动kestrel或IIS Express时,更改才会显示出来。

但是,奇怪的是,我可以编辑.cs控制器文件,然后该站点可以自行重新编译,而无需重新启动它-至少在Windows中。(在OSX中,编辑控制器文件不会导致自动重新编译,但这是一个问题,我相信dnx-watch可以解决该问题)。

在project.json或另一个安装文件中是否缺少我导致Windows出现问题的内容?

我试过了:

  • 创建第二个完全干净的Web应用程序项目
  • 重新安装ASP.NET
  • 绝望的是,最后,使用Visual Studio 2015 Community Edition创建Windows 10的全新安装,无济于事

如何在Windows中使Kestrel或IIS Express在更新后的cshtml View文件被编辑后不重新启动服务器的情况下为其提供服务?

*旁注,OSX中的ASP.NET MVC很棒!

asp.net-core-mvc asp.net-core

5
推荐指数
1
解决办法
921
查看次数

HttpClientFactory-通过名称获取命名的类型化客户端

HttpClientFactory提供以下扩展方法:

public static IHttpClientBuilder AddHttpClient<TClient>(this IServiceCollection services, string name)
Run Code Online (Sandbox Code Playgroud)

并且我创建了一个类型化的HttpClient,如下所示:

public class CustomClient {

    public CustomClient(HttpClient client,
        CustomAuthorizationInfoObject customAuthorizationInfoObject) {
        /// use custom authorization info to customize http client
    }

    public async Task<CustomModel> DoSomeStuffWithClient() {
        /// do the stuff
    }

}
Run Code Online (Sandbox Code Playgroud)

我可以在程序的ServiceCollection中注册此自定义客户端,如下所示:

services.AddTransient<CustomAuthorizationInfoObject>();
services.AddHttpClient<CustomClient>("DefaultClient");
Run Code Online (Sandbox Code Playgroud)

然后,我可以注册此CustomClient的第二个实例,其中包含一些稍有更改的信息:

services.AddHttpClient<CustomClient>("AlternativeAuthInfo", (client) => {
    client.DefaultRequestHeaders.Authorization = ...;
});
Run Code Online (Sandbox Code Playgroud)

在程序的其他地方,我现在想获取一个特定的名称CustomClient。这证明了障碍。

CustomClient只需通过CustomClient服务提供商的请求,我就能获得最后添加到服务中的任何一个。

IHttpClientFactory.CreateClient("AlternativeAuthInfo")例如,调用会返回HttpClient,因此我无法在CustomClient中访问其他方法,并且似乎没有其他任何方法可以帮助我。

因此,我该如何获取命名的CustomClient?还是我滥用通过原始扩展名来命名和引用类型化客户的机会?

c# .net-core asp.net-core-2.0

5
推荐指数
1
解决办法
617
查看次数