我想使用 Entity Framework 从 2 个表返回数据,以及从 2 个表中选择列,起初我对一些简单的事情不太走运,比如返回 int 和字符串(即 select new { id = t1.ID, other = t2.OtherData }
,因为在目的地转换匿名类型很麻烦(目的地是我的 winform),所以我想出了只返回两个表行的想法......
所以像这样:
public static IQueryable<{Table1,Table2}> byRecID(Guid recID, MyContext DBContext)
{
return (from i1 in DBContext.Table1
join j1 in DBContext.Table2 on i1.GroupID equals j1.GroupID
where i1.RecID.Equals(RecID)
select new { i1, j1 }).SingleOrDefault();
}
这一切都很好,除了方法的返回类型不正确。我试过几种组合。不幸的是,当我从 winform 调用“byRecID”时,“SingleOrDefault”不可用,但在“byRecID”方法中可用,所以我不能只返回 IQueryable
,需要输入 IQueryable<SOMETHING IN HERE>
(因为 SingleOrDefault
不是IQueryable
,只有 IQueryable<T>
)。
我的问题...是否有“SOMETHING IN HERE”的语法可以让我指定它是两个表行的连接?
我想知道...为什么 SingleOrDefault 是方法内部的一个选项,而不是从我的 winform 调用时方法结果的一个选项?
基本上我希望有一些东西允许从我的 winforms 中进行干净的数据调用,而不是转换为可怕的匿名类型然后使用反射(就像当我返回匿名类型的基元时),但也不想生成一个 Type 只是为了通过我的 byRecID
方法使用。
最佳答案
在 C# 中,匿名类型最好用在您投影它们的同一方法的范围内。正如您亲眼所见它们不能在定义方法之外使用。所以你不能从方法中返回匿名类型(并保留它们的结构,你总是可以将它们作为对象返回,但这不是一个好主意)这会使你的方法语法无效。
最好的选择是将结果投影到根据您的需要指定的类。
public class TableJoinResult
{
public Table1 Table1 { get; set; }
public Table2 Table2 { get; set; }
}
您的查询:
public static IQueryable<TableJoinResult> byRecID(Guid recID, MyContext DBContext)
{
return (from i1 in DBContext.Table1
join j1 in DBContext.Table2 on i1.GroupID equals j1.GroupID
where i1.RecID.Equals(RecID)
select new TableJoinResult { Table1= i1, Table2 = j1 }).SingleOrDefault();
}
关于匿名类型的更多信息:https://msdn.microsoft.com/en-us/library/bb397696.aspx
关于c# - Entity Framework 返回两个表连接的 IQueryable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42256412/