给定EF-Code First CTP5实体布局,如:
public class Person { ... }
Run Code Online (Sandbox Code Playgroud)
它有一个集合:
public class Address { ... }
它有一个单一的关联:
public class Mailbox { ... }
我想要做:
PersonQuery.Include(x => x.Addresses).Include("Addresses.Mailbox")
没有使用魔法字符串.我想用lambda表达式来做.
我知道我上面输入的内容将编译并将所有匹配搜索条件的人员带回他们的地址和每个地址的邮箱急切加载,但它是一个令我恼火的字符串.
如果没有字符串我该怎么办?
谢谢堆栈!
所以经过多次搞砸后,我终于将Ninject连接起来并在我的MVC4应用程序中进行编译.我遇到的问题是IDependencyScope接口不再存在,我所知道的并且System.Web.Http.Dependencies命名空间已经废除.
所以,我现在的问题是我已经连接了所有内容并运行我得到的应用程序:
Sequence contains no elements
[InvalidOperationException: Sequence contains no elements]
System.Linq.Enumerable.Single(IEnumerable`1 source) +379
Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin.Start() in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectMvcHttpApplicationPlugin.cs:53
Ninject.Web.Common.Bootstrapper.<Initialize>b__0(INinjectHttpApplicationPlugin c) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:52
Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:31
Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:53
Ninject.Web.Common.NinjectHttpApplication.Application_Start() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\NinjectHttpApplication.cs:81
Run Code Online (Sandbox Code Playgroud)
我无法追踪甚至开始了解它的来源.
我在Global.asax.cs中的标准Ninject方法如下所示:
protected override IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
kernel.Bind<IRenderHelper>().To<RenderHelper>();
GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel));
return kernel;
}
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
BundleTable.Bundles.RegisterTemplateBundles();
}
Run Code Online (Sandbox Code Playgroud)
我的定制解析器:
public class NinjectDependencyResolver : IDependencyResolver
{
private readonly IKernel _kernel;
public NinjectDependencyResolver(IKernel kernel)
{
_kernel …Run Code Online (Sandbox Code Playgroud) 我有一个简单的问题,但我自己无法找到答案.
我正在使用EF4 CTP-5 Code First Model和手工生成的POCO.它正在处理生成的SQL中的字符串比较
WHERE N'Value' = Object.Property
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用以下方法覆盖此功能:
[Column(TypeName = "varchar")]
public string Property {get;set;}
Run Code Online (Sandbox Code Playgroud)
这解决了该单个事件的问题并正确生成SQL为:
WHERE 'Value' = Object.Property
Run Code Online (Sandbox Code Playgroud)
但是,我正在处理一个非常大的域模型并遍历每个字符串字段并设置TypeName ="varchar"将非常非常繁琐.我想指定EF应该在整个板上看到字符串为varchar,因为这是该数据库中的标准,nvarchar是例外情况.
想要纠正这个问题的推理是查询执行效率.varchar和nvarchar之间的比较在SQL Server 2k5中非常低效,其中varchar到varchar比较几乎立即执行.
我想找到一种方法使用Linq将导航属性过滤到相关实体的子集.我知道围绕这个主题的所有答案建议做一个匿名选择器,如:
query.Where(x => x.Users.Any(y => y.ID == actingUser.ID))
.Select(x => new
{
Event = x,
Discussions = x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())
})
.OrderBy(x => x.Discussions.Count())
.ThenBy(x => x.Event.Name);
Run Code Online (Sandbox Code Playgroud)
但是,由于我们的查询生成的一般性质,这显然不太理想,如果你抛出探查器,也会产生非常可怕的SQL查询.
我希望能够完成以下事情:
query.Include(x => x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>()))
.OrderBy(x => x.Discussions.Count())
.ThenBy(x => x.Name);
Run Code Online (Sandbox Code Playgroud)
我知道这是不是在EF5(或与此有关的任何版本)的支持,但必须有完成约束的结果通过LINQ的不钻研匿名类型select语句设置的方式.
我试图做一些事情:
query.GroupJoin(discquqery,
x => x.ID,
x => x.Event.ID,
(evt, disc) => evt.Discussions = disc.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,您无法在lambda表达式中进行赋值,并且在此处选择匿名类型会导致使用select时遇到的相同困境.
我想我无法理解为什么EF没有提供一种方法(我能找到)来生成:
SELECT
--Properties
FROM Event e
LEFT OUTER JOIN Discussions d
ON e.ID = d.EventID AND --Additional constraints
WHERE
--Where conditions
ORDER BY
--Order Conditions
Run Code Online (Sandbox Code Playgroud)
在SQL中约束连接是如此简单,HAS也是通过Linq实现它的一种方式.
PS:我已经搜索了堆栈,MSDN,专家交流等.请认识到这不是重复.甚至触及这个问题的任何一个都有一个警告"它无法完成"的答案或根本没有答案.没有什么是不可能的......包括这个.
我将在前面加上我正在积极寻找解决这个问题的方法,但我想如果有人在堆栈上找到这个问题,我可能会缩短一些研究和开发时间.(我在网上找不到任何东西,所以这里有)
我们在构建的应用程序框架中有一个案例,我们需要能够接受一组Predicates(List<Expression<Func<T,bool>>>)并在搜索框架中解析它.
现在我们有能力以这种方式过滤:
//Assume predicates is passed as a method argument.
// of List<Expression<Func<T,bool>>>
//Assume user is passed in as a method argument.
//Assume FilterToUserAccess is a custom extension method that restricts the dataset
// to access restrictions.
var query = _dbContext.Set<EntityType>()
.FilterToUserAccess(user);
foreach(var p in predicates){
query = query.Where(p);
}
return p.ToList();
Run Code Online (Sandbox Code Playgroud)
我们需要这样做的原因是可过滤对象的可扩展性.但是,对于快速搜索,鉴于EF的内置功能,这是不可能的.我需要做的是:
对象A(让我们假装它是一辆赛车),我们想在快速搜索框中搜索品牌,型号,团队和驱动程序.因此,如果我输入"Earnhardt",它将搜索所有赛车实体属性,包括品牌,型号,团队和驱动程序.我最终会得到所有的DEI汽车以及Dale Jr.我想使用相同的方法,因此我们可以配置一个可搜索的实体并在应用程序启动时反映搜索配置.理想情况下,我想让查询看起来像这样:
//Assume predicates is passed as a method argument.
// of List<Expression<Func<T,bool>>>
//Assume user is passed in as a method argument.
//Assume FilterToUserAccess …Run Code Online (Sandbox Code Playgroud) 我们在我们的应用程序中使用了所有Response DTO的基类.该课程有以下签名:
[Serializable]
public abstract class ResponseBase
{
public bool Successful { get; set; }
public List<ResponseMessage> Messages { get; set; }
//...Other code...
}
Run Code Online (Sandbox Code Playgroud)
Messages集合可以是以下任何类型:
[Serializable]
[XmlInclude(typeof(DebugMessage))]
[XmlInclude(typeof(InfoMessage))]
[XmlInclude(typeof(ValidationMessage))]
[XmlInclude(typeof(WarnMessage))]
[XmlInclude(typeof(RecoverableFaultMessage))]
[XmlInclude(typeof(FatalFaultMessage))]
public abstract class ResponseMessage
{
//..Other code...
}
Run Code Online (Sandbox Code Playgroud)
具体版本:
[Serializable]
public class DebugMessage : ResponseMessage
{
public override MessageType MessageType { get { return MessageType.Debug; } }
}
[Serializable]
public class InfoMessage : ResponseMessage
{
public override MessageType MessageType { get { return MessageType.Info; } }
} …Run Code Online (Sandbox Code Playgroud) 给定一个控制器Proxy和一个动作GetInformation。我希望能够调用的方法GetInformation中的Users控制器。两个WebAPI控制器都在同一个项目中,但直接调用如
var controller = new UsersController();
return controller.GetInformation(request);
Run Code Online (Sandbox Code Playgroud)
不起作用
签名是:
public HttpResponseMessage GetInformation(InformationRequest request)
Run Code Online (Sandbox Code Playgroud)
我不想做一个完整的重定向响应,因为我不想在外部公开UserController路由。这仅是内部调用。
我想知道这段代码是否可以改进.IProvider实现IProvider并覆盖Request(...).我想将它们组合成一个单独的界面.但我仍然需要一个类型和无类型的接口来使用.
有没有办法将这两者结合起来,或者这是接口的外观?
public interface IProvider
{
DataSourceDescriptor DataSource { get; set; }
IConfiguration Configuration { get; set; }
IResult Request(IQuery request);
}
public interface IProvider<T> : IProvider
{
new IResult<T> Request(IQuery request);
}
Run Code Online (Sandbox Code Playgroud) 使用Azure ServiceBus和OnMessage调用我正在寻找一种方法来确定OnMessage事件泵是否停止从队列中读取.
我们与OnMessage的连接配置如下:
protected virtual void DoSubscription(string queueName, Func<QueueRequest, bool> callback)
{
var client = GetClient(queueName, PollingTimeout);
var transformCallback = new Action<BrokeredMessage>((message) =>
{
try
{
var request = message.ToQueueRequest();
if (callback(request))
{
message.Complete();
}
else
{
message.Abandon();
Log.Warn("DoSubscription: Message Failed to Process Gracefully: {0}{1}", Environment.NewLine, JsonConvert.SerializeObject(request));
}
}
catch (Exception ex)
{
Log.Error("DoSubscription: Message Failed to Process With Exception:", ex);
message.Abandon();
}
});
var options = new OnMessageOptions
{
MaxConcurrentCalls = _config.GetInt("MaxThreadsPerQueue"),
AutoComplete = false,
AutoRenewTimeout = new TimeSpan(0,0,1) …Run Code Online (Sandbox Code Playgroud) 在对非常高吞吐量的应用程序进行性能测试期间,我们发现 JSON.NET 的ContractResolver. 不幸的是,当您指定一个时ContractResolver,性能似乎变得难以忍受,包括DefaultContractResolver
寻求其他专家的建议,以获取有关如何获得性能而不锁定 CPU 并占用不合理时间的任何建议。现在,由于这个问题,我们看到性能下降了 87%(有任何ContractResolver定义的每秒 80 个请求,没有ContractResolver
定义的每秒 600 个请求。
测试运行的输出是:
默认解析器: Time elapsed 3736 milliseconds
NoOp 解析器: Time elapsed 4150 milliseconds
无解析器: Time elapsed 8 milliseconds
蛇盒: Time elapsed 4753 milliseconds
第三方(SnakeCase.JsonNet): Time elapsed 3881 milliseconds
突出这一点的测试如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using SnakeCase.JsonNet;
namespace Anonymous.Public.Namespace
{
public class Person
{
public string Name { get; set; }
public DateTime DateOfBirth …Run Code Online (Sandbox Code Playgroud) 我正在使用MVC4连接Ninject并让它正在努力实际解决依赖关系.但是,我得到以下异常:
找不到方法:'System.Web.Http.Services.DependencyResolver System.Web.Http.HttpConfiguration.get_ServiceResolver()'.
任何人遇到这个并有一个解决方案吗?
是否可以sequelize根据路由更改数据库连接?
例如,用户可以访问网站中的两个不同的安装: - example.com/foo
-example.com/bar
登录后,用户被重定向到example.com/foo
要获取该foo站点的所有任务,他们需要访问example.com/foo/tasks
该bar站点使用一个单独的数据库,因此如果他们想要获得bar他们必须去的所有任务example.com/bar/tasks
每个安装都有自己的数据库,并且所有数据库都具有相同的模式.
是否可以根据访问的路由更改数据库连接?
*登录只发生一次
c# ×10
linq ×2
ninject ×2
azure ×1
c#-4.0 ×1
code-first ×1
express ×1
generics ×1
javascript ×1
json.net ×1
node.js ×1
oop ×1
sequelize.js ×1
wcf ×1
wcf-binding ×1