我正在尝试使用Url.Action方法为ajax调用正确生成所需的Url但是在尝试构建RouteValues时我遇到了问题,这里是代码问题行:
var url = @Url.Action("ViewFile", "Default", new { itemId = $(this).data("itemid") });
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我想对jQuery的结果分配$(this).data("itemid")
给itemId
在RouteValues.
有没有办法使用razor语法来允许这些代码编译?
谁能告诉我Oracle数据访问组件12c是否与Entity Framework 6兼容?Oracle网站是文档的噩梦,无法找到有关如何解决此问题的任何参考.
我有一个现有项目,我正在尝试升级到ODAC 12c和EF6,但我收到以下错误,我正在努力解决:
我创建了一个新项目来排除现有项目的任何问题,我也遇到了同样的问题.我认为这是由Entity Framework Power Tools Beta 4(逆向工程师代码优先)自动编辑的app.config文件的问题:
谁能指出我正确的方向?
我在下面有代码示例查询产品列表.
var productResults = Products.Where((p) => refFilterSequence.Contains(p.Ref))
.GroupBy(g => g.Code, (key, g) => g.OrderBy(whp => whp.Ref).First()).ToList();
Run Code Online (Sandbox Code Playgroud)
这完全符合预期,并在使用内存集合时返回我想要的4行,但是在针对Oracle数据库运行时:
.GroupBy(g => g.Code, (key, g) => g.OrderBy(whp => whp.Ref).First())
Run Code Online (Sandbox Code Playgroud)
这会抛出一个错误,说我应该使用FirstOrDefault
Oracle数据库不支持的错误.错误oracle 11.2.0.3.0不支持apply thrown.谷歌在CodePlex上揭示了这一点:https://entityframework.codeplex.com/workitem/910.
使用以下二进制文件时会发生这种情况:
该数据库是Oracle 11.2.0.3.0数据库.
生成的sql使用OUTER APPLY(见下图),但11.2.0.3.0版本的Oracle不支持,那么为什么EF/Oracle.ManagedDataAccess会尝试使用它?有没有办法告诉EF不要使用APPLY关键字?
下面的页面显示在Oracle 12c第1版中添加了APPLY支持,但我无法更新所有数据库只是为了使GROUP BY工作. http://www.oracle.com/technetwork/database/windows/newfeatures-084113.html
看来这是一个已知问题(SqlClient for Entity Framework中的已知问题):
以下是一些可能导致输出查询中存在CROSS APPLY和/或OUTER APPLY运算符的典型场景:
- 使用接受元素选择器的分组方法的LINQ查询.
在我求助于创建视图之前(我必须在几个数据库上创建视图),任何人都可以看到另一个解决方案吗?
对于任何感兴趣的人,对我的数据库版本执行我想做的SQL看起来如下所示:
select *
from ( select RANK() OVER (PARTITION BY sm.product ORDER BY refs.map) ranking, …
Run Code Online (Sandbox Code Playgroud) 使用Web API和OData,我有一个服务,它公开数据传输对象而不是实体框架实体.
我使用AutoMapper将EF实体转换为其DTO计数器部件ProjectTo()
:
public class SalesOrdersController : ODataController
{
private DbContext _DbContext;
public SalesOrdersController(DbContext context)
{
_DbContext = context;
}
[EnableQuery]
public IQueryable<SalesOrderDto> Get(ODataQueryOptions<SalesOrderDto> queryOptions)
{
return _DbContext.SalesOrders.ProjectTo<SalesOrderDto>(AutoMapperConfig.Config);
}
[EnableQuery]
public IQueryable<SalesOrderDto> Get([FromODataUri] string key, ODataQueryOptions<SalesOrderDto> queryOptions)
{
return _DbContext.SalesOrders.Where(so => so.SalesOrderNumber == key)
.ProjectTo<SalesOrderDto>(AutoMapperConfig.Config);
}
}
Run Code Online (Sandbox Code Playgroud)
AutoMapper(V4.2.1)配置如下,请注意,ExplicitExpansion()
当未请求时,会阻止序列化自动扩展导航属性:
cfg.CreateMap<SalesOrderHeader, SalesOrderDto>()
.ForMember(dest => dest.SalesOrderLines, opt => opt.ExplicitExpansion());
cfg.CreateMap<SalesOrderLine, SalesOrderLineDto>()
.ForMember(dest => dest.MasterStockRecord, opt => opt.ExplicitExpansion())
.ForMember(dest => dest.SalesOrderHeader, opt => opt.ExplicitExpansion());
Run Code Online (Sandbox Code Playgroud)
ExplicitExpansion()
然后创建一个新问题,其中以下请求引发错误:
/ odatademo/SalesOrders表( '123456')?$扩大= SalesOrderLines …
使用HttpClientFactory我们可以配置依赖注入来创建和管理 HttpClients 的生命周期:
public class GitHubService : IGitHubService
{
public HttpClient Client { get; }
public GitHubService(HttpClient client)
{
client.BaseAddress = new Uri("https://api.github.com/");
// GitHub API versioning
client.DefaultRequestHeaders.Add("Accept",
"application/vnd.github.v3+json");
// GitHub requires a user-agent
client.DefaultRequestHeaders.Add("User-Agent",
"HttpClientFactory-Sample");
Client = client;
}
public async Task<IEnumerable<GitHubIssue>> GetAspNetDocsIssues()
{
var response = await Client.GetAsync(
"/repos/aspnet/AspNetCore.Docs/issues?state=open&sort=created&direction=desc");
response.EnsureSuccessStatusCode();
using var responseStream = await response.Content.ReadAsStreamAsync();
return await JsonSerializer.DeserializeAsync
<IEnumerable<GitHubIssue>>(responseStream);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 Startup.cs 中我们配置 DI:
services.AddHttpClient<GitHubService>();
Run Code Online (Sandbox Code Playgroud)
但是,如果类型化的客户端有额外的构造函数参数,应该如何提供这些参数?例如,如果要传入存储库名称:
public class GitHubService : IGitHubService
{
public HttpClient …
Run Code Online (Sandbox Code Playgroud) 给出以下形式的过滤器参数列表:
public class filterParm
{
public int age { get; set; }
public string name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
哪里:
var parms = new List<filterParm>
{
new filterParm {age = 22, "phil"},
new filterParm {age = 19, "dave"},
new filterParm {age = 31, "nick"}
};
Run Code Online (Sandbox Code Playgroud)
如何编写一个表达式,该表达式将导致以下SQL where子句(请注意以粗体显示的OR运算符:
WHERE(年龄= 22 AND name ="phil")
OR(年龄= 19 AND name ="dave")
OR(年龄= 31 AND name ="nick")
我当前的实现导致AND运算符分隔的每个语句:
private _dbSet<user> Users { get; set; }
public List<user> CustomFilter(List<filterParm> …
Run Code Online (Sandbox Code Playgroud) 使用实体框架(代码优先),我试图映射以下两个实体之间的条件/过滤关系:
构建
BuildingId
BuildingName
Area
AreaId
ParentId
AreaName
IsSubArea
一个建筑可以有许多地区
的区域可以有多个(次)地区
我想创建建筑和区域之间的关系,其中标有'IsSubArea'的区域被过滤掉.在此上下文中,ParentId将与Building相关,否则,ParentId将是另一个Area.这将允许我创建具有许多区域的建筑物,并且每个区域可以具有许多子区域,从而创建树形结构.
与我发现的解决方案最接近的是"软删除"功能(来源):
modelBuilder.Entity<Foo>().Map(m => m.Requires("IsDeleted").HasValue(false));
Run Code Online (Sandbox Code Playgroud)
转换为适合我的例子:
modelBuilder.Entity<Area>().Map(m => m.Requires("IsSubArea").HasValue(false));
Run Code Online (Sandbox Code Playgroud)
但据我所知,这与建筑物的关系无关.
另一种解决方案是在Building上创建一个属性,该属性指定用于返回相关区域的查询定义(源):
public class Building
{
public int BuildingId {get; set;}
public string BuildingName {get; set;}
public IQueryable<Area> BuildingAreas
{
get
{
return from area in areas
where area.IsSubArea == false
and area.ParentId == BuildingId
select area;
//Assume I have …
Run Code Online (Sandbox Code Playgroud) 使用 Web Api 我有一个 OData EndPoint,它可以从数据库返回产品。
我有多个具有相似架构的数据库,并且希望在 URL 中传递一个参数来标识 Api 应使用哪个数据库。
当前 Odata 端点:
http://localhost:62999/Products
我想要的:
http://localhost:62999/ 999 /Products
在新的 Url 中,我传入 999(数据库 ID)。
数据库 ID 旨在指定从哪个数据库加载产品。例如,localhost:62999/999/Products('ABC123')
将从数据库 999 加载产品“ABC123”,但下一个请求localhost:62999/111/Products('XYZ789')
将从数据库 111 加载产品“XYZ789”。
下面的网址有效,但我不喜欢它。
localhost:62999/Products('XYZ789')?database=111
这是控制器的代码:
public class ProductsController : ErpApiController //extends ODataController, handles disposing of database resources
{
public ProductsController(IErpService erpService) : base(erpService) { }
[EnableQuery(PageSize = 50)]
public IQueryable<ProductDto> Get(ODataQueryOptions<ProductDto> queryOptions)
{
return ErpService.Products(queryOptions);
}
[EnableQuery]
public SingleResult<ProductDto> Get([FromODataUri] string key, ODataQueryOptions<ProductDto> queryOptions)
{
var result …
Run Code Online (Sandbox Code Playgroud) 我在使用针对 CHAR 列的 WHERE 子句从 Oracle 数据库返回数据时遇到问题。
我提供了以下步骤,应该可以重新创建问题:
数据库设置
运行以下 SQL 创建数据库表并插入模拟数据:
CREATE TABLE ORDERS (ORDER_NUMBER CHAR(10 BYTE));
INSERT INTO ORDERS VALUES ('123456');
SELECT REPLACE(ORDER_NUMBER, ' ', '#') as ORDER_NUMBER from ORDERS
ORDER_NUMBER
123456####
正如您所看到的,存储在表中的值用空格填充到 10 个字符(用“#”替换以使其明显)。
实体框架设置
public class Order
{
public string OrderNumber { get; set; }
}
public class OrderMap : EntityTypeConfiguration<Order>
{
public OrderMap()
{
// Primary Key
HasKey(t => t.OrderNumber);
Property(t => t.OrderNumber)
.HasColumnName("ORDER_NUMBER")
.IsRequired()
.IsFixedLength()
.HasMaxLength(10)
.HasColumnType("CHAR")
.IsUnicode(false);
}
}
public class OrdersContext()
{ …
Run Code Online (Sandbox Code Playgroud) 我已按照此处的说明编写了一个自定义配置提供程序,以从数据库表加载ASP.NET Core配置:
SqlDependency
如果数据库中的值发生更改,我的提供程序将用于重新加载配置。
该文档的SqlDependency
规定:
必须为每个Start调用调用Stop方法。给定的侦听器仅在收到与启动请求相同数量的停止请求时才完全关闭。
我不确定如何在ASP.NET Core的自定义配置提供程序中执行此操作。
下面是代码:
DbConfigurationSource
基本上是一个容器,IDbProvider
用于处理从数据库中检索数据
public class DbConfigurationSource : IConfigurationSource
{
/// <summary>
/// Used to access the contents of the file.
/// </summary>
public virtual IDbProvider DbProvider { get; set; }
/// <summary>
/// Determines whether the source will be loaded if the underlying data changes.
/// </summary>
public virtual bool ReloadOnChange { get; set; }
/// <summary>
/// Will be called if an uncaught exception …
Run Code Online (Sandbox Code Playgroud) 给出以下interface
默认实现:
public interface IState
{
string Name => "Unknown";
}
Run Code Online (Sandbox Code Playgroud)
以及一个具体的实现如下:
public class Demo: IState
{
public void PrintName()
{
Console.WriteLine(this.Name); // <-- this is invalid syntax
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以从具体类型中调用默认实现?
我已经查看了 C# 8.0 的默认实现的文档 ,如果答案在那里,我无法发现它。
我试图使用MSDN上描述的方法在本地计算机上显示已安装的打印机列表...
using System.Drawing;
using System.Drawing.Printing;
namespace SandBox
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
{
Console.WriteLine(PrinterSettings.InstalledPrinters[i]);
}
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题出在Using
声明中,'Printing'命名空间无法解析.我还缺少一个额外的参考吗?
更新:我已添加对System.Drawing
&的引用,System.Printing
但这不能解决问题.
c# ×11
.net ×4
asp.net ×3
oracle ×3
asp.net-core ×2
odac ×2
odata ×2
asp.net-mvc ×1
automapper ×1
c#-8.0 ×1
javascript ×1
jquery ×1
linq ×1
razor ×1
sql-server ×1