在我的代码中 - 改名为保护无辜的名字:) - 我有:
[Table("schema.Items")] //The table
public class Item
{
//...all of the fields that exist in both the table and the view.
}
澄清:
ClassA
和ClassB
的方法,两者都具有相同的属性,因此我可以从视图中拉出一个,从表中拉出另一个。答案 0 :(得分:2)
如果我理解正确,您可以使用SqlQuery
从查看生成的查询中加载。
var db = ...; // instance of context
var q = db.Set<ViewModel>().Where(...).ToString();
var result = db.Database.SqlQuery<TableModel>(q);
<强> PS 强>
如果视图名称的格式类似于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);