我正在使用Microsoft的Entity Framework作为ORM,我想知道如何解决以下问题.我想Product从Products集合中获得Product.StartDate比当今更大的对象.(这是整个问题的简化版本.)
我目前使用:
var query = dbContext.Products.Where(p => p.StartDate > DateTime.Now);
Run Code Online (Sandbox Code Playgroud)
执行此操作时,在使用ToList()例如查询后,它可以正常工作,并且创建的SQL是有效的:
SELECT * FROM Product WHERE StartDate > (GetDate());
Run Code Online (Sandbox Code Playgroud)
但是,我想将谓词移动到一个函数以获得更好的可维护性,所以我尝试了这个:
private Func<Product, bool> GetFilter()
{
Func<Product, bool> filter = p => p.StartDate > DateTime.Now;
return filter;
}
var query = dbContext.Products.Where(GetFilter());
Run Code Online (Sandbox Code Playgroud)
这也是从代码的角度来看,只要它返回相同的Product集合,但这次创建的SQL类似于:
SELECT * FROM Product;
Run Code Online (Sandbox Code Playgroud)
筛选器从SQL Server移动到客户端,使其效率降低.
所以我的问题是:
在删除列的迁移操作期间,如何在尝试删除列之前先生成 SQL 以检查该列是否存在?
对于删除列操作,实体框架当前生成这样的 sql 来删除列:
// Migration Operation:
DropColumn("dbo.Table", "Column");
// TSQL generated:
// Dependency management logic ...
ALTER TABLE [dbo].[Table] DROP COLUMN [Column]
Run Code Online (Sandbox Code Playgroud)
如何更改 SQL 以首先检查列是否存在:
// Migration Operation:
DropColumn("dbo.Table", "Column");
// TSQL desired:
IF EXISTS (SELECT * FROM sys.columns WHERE object_id = Object_id('dbo.Table') AND name = 'Column')
BEGIN
// Dependency management logic ...
ALTER TABLE [dbo].[Table] DROP COLUMN [Column]
END
Run Code Online (Sandbox Code Playgroud)
我知道可以通过继承自SqlServerMigrationSqlGenerator. 我这样做的尝试未能将默认放置列逻辑包装在一个IF块中。请参阅下面的示例:
public class CustomSqlServerMigrationSqlGenerator: SqlServerMigrationSqlGenerator
{
/// <summary>
/// Drop column only …Run Code Online (Sandbox Code Playgroud) entity-framework sql-generation ef-code-first entity-framework-6 entity-framework-migrations
如何WHERE使用SQL :: Abstract为此查询生成子句:
SELECT COUNT(*)FROM表WHERE id = 111 AND NOT FIND_IN_SET(type,'1,2,3,4')AND status ='pending';
包含条件的正确方法是WHERE FIND_IN_SET(type, '1,2,3,4')什么?
这是我关于SO的第一个问题.
我有一个ASP.NET 4.0 MVC3项目,使用EF Code First作为ORM和FluentMigrator进行版本迁移.我有Message实体类,如下所示:
public class Message
{
[Key]
[Column("Message_Id")]
public int Id { get; set; }
public DateTime CreatedTime { get; set; }
[Required]
[StringLength(MaxSubjectLength)]
public string Subject { get; set; }
[Required]
[StringLength(MaxBodyLength)]
public string Body { get; set; }
public Link Link { get;set; }
}
Run Code Online (Sandbox Code Playgroud)
没有定义自定义映射,并且MSSQL Server 2012数据库表消息:
CREATE TABLE [dbo].[Messages](
[Message_Id] [int] IDENTITY(1,1) NOT NULL,
[CreatedTime] [datetime] NOT NULL,
[Subject] [nvarchar](78) NOT NULL,
[BodyHtml] [nvarchar](2000) NOT NULL,
[Link_Id] [int] NULL,
[Collection_Id] [int] NULL, …Run Code Online (Sandbox Code Playgroud)