c# - Entity Framework 返回两个表连接的 IQueryable

标签 c# linq entity-framework-6

我想使用 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/

相关文章:

c# - 无法识别 Entity Framework 更 retrofit 配模型

c# - LINQ GroupBy 抛出错误

c# - 带 OR 的 linq where 语句

c# - EFCache CachingProviderServices 缺少静态 Instance 属性

asp.net-web-api - 到 Web Api 的动态连接字符串

c# - Entity Framework - 如何删除链接元素

javascript - 使用 javascript 代码调用 c# 函数

c# - 如何在不知道哪个为空的情况下隐藏 gridview 中的空列?

c# - 无法获取具有 CLSID {A9E69610-B80D-11D0-B9B9-00A0C922E750} 的组件的类工厂 de COM 错误 : 80040154 Class not Registered

c# - 使用 Linq 映射模型