在我的代码中-更改名称以保护无辜的人:)-我有:
[Table("schema.Items")] //The table
public class Item
{
//...all of the fields that exist in both the table and the view.
}
说明:
ClassA
和ClassB
都具有相同属性的方法,只是我可以从视图中拉出一个,而从表中拉出另一个。如果我对您的理解正确,则可以使用SqlQuery
加载从视图生成的查询。
var db = ...; // instance of context
var q = db.Set<ViewModel>().Where(...).ToString();
var result = db.Database.SqlQuery<TableModel>(q);
聚苯乙烯
如果视图名称具有类似的模式view_TableName
,则可以使用TableModel
生成查询,然后将表名称替换为视图名称。
这是一种可以实现此目的的扩展方法。
public static string GetViewSql<T>(this DbContext db, IQueryable<T> q)
where T : class
{
const string prefix = "view_";
var tableName = Regex.Match(
db.Set<T>().ToString(),
@"FROM (\[.*\]\.\[.*\]) AS \[Extent1\]").Groups[1].Value;
var viewName = Regex.Replace(
tableName,
@"\[.*\]\.\[(.*)\]",
m => m.Groups[0].Value.Replace(
m.Groups[1].Value, prefix + m.Groups[1].Value));
var sql = q.ToString().Replace(tableName, viewName);
return sql;
}
用法:
var query = db.Set<TableModel>().Where(...);
var sql = db.GetViewSql(query);
var result = db.Database.SqlQuery<TableModel>(sql);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句