【问题标题】:Suitable type to Store Linq result in order to be able to query it later适合存储 Linq 结果的类型,以便以后能够查询它
【发布时间】:2014-01-28 06:47:04
【问题描述】:

我在我的项目中使用 linq to sql。在 Form1 我查询如下表:

var dc = new Data.MyDataContext();
var query = from c in dc.Customers select c;  
program.MainForm.query = query;

或者在 Form2 中查询如下表格:

var dc = new Data.MyDataContext();
var query = from b in dc.Banks select b;  
program.MainForm.query = query;

我想稍后在 MainForm 中执行以下操作:

this.DataGridView1.DataSource = this.query.Where(item=>item.ID < 10);

我不知道如何存储对象。我尝试将它存储为 IQueryable,但我无法查询它,因为它是一个接口。

我想在查询中存储来自不同表的结果,这样做的简单方法是什么?我认为泛型可以提供帮助,但我不知道如何。

【问题讨论】:

  • 您正在混合 UI 和数据访问。这会给你带来什么好处?
  • @SergeyBerezovskiy 我们正在尝试编写一个可以处理任何表格结果的自定义控件,并且我们想在自定义控件中进行操作,例如我们想在类中搜索数据。我们加载数据一次,可能会执行多次内部搜索,而无需再次获取数据。而且这个控件必须在不同的项目中使用。这就是为什么我希望它能够处理来自不同来源的数据。
  • @SergeyBerezovskiy 想象我正在使用 DataTables,然后我可以存储来自具有不同列类型和计数的不同表的结果。该解决方案适用于我的情况,但我想使用 LINQ,因为它更快、更容易使用,并且提供更简洁的代码,更易于维护和开发。
  • 您仍然可以将所有查询移动到另一个组件并使其仅返回将显示在您的控件上的数据
  • @SergeyBerezovskiy 我希望控件像基本控件一样工作。与 DataGridView 的工作方式完全一样。它说给我来源,我会处理其余的。我希望我的控件接受不同的数据源(如 DataTable、List 等),只接受每个 LINQ 结果就足够了。对于每个 LINQ 结果,我的意思是来自不同表的结果,因此我不能声明特定类型。这就是为什么我希望它是通用的。

标签: c# linq generics linq-to-sql types


【解决方案1】:

如果您想保留查询,您需要一个 IQueryable&lt;T&gt; 类型的字段,其中 T 是查询的对象类型。

如果您想保留查询结果(例如,您可以在 RAM 中搜索而不再次获取数据),您将需要一些具体化的数据结构,例如 IList&lt;T&gt;

这两个选项都有问题,因为它们需要类型参数,而且 UserControls 不能是通用的。我想您可以使用IQueryable&lt;object&gt;IList&lt;object&gt;,但是您将无法对生成的对象做很多事情,因为控件对它们的类​​型一无所知。

顺便说一句,正如@SergeyBerezovskiy 所说,像这样混合数据访问和表示逻辑也可能不是一个好主意。

【讨论】:

  • 这当然不是一个好主意,问题是我的客户想要这个代码。他希望它是一个可以处理任何类型的魔法盒子。如果我使用 IQueryable 那么我可以使用反射进行内部搜索吗?
  • 如果您想使用反射在结果中进行搜索,听起来您想保存查询结果(实际对象)并对其进行进一步操作(例如通过反射调用属性获取器) .为此,您不需要IQueryable,而是需要IListIQueryable 仅在您想在数据库上执行之前更改查询时才需要(例如,如果用户控件可能向查询添加新的 Where 子句)。
  • @MahdiTahsildari:请定义“句柄”。 究竟你打算对查询结果做什么?
  • 我忘了提到速度对我的客户来说非常重要。并且 AFAIK 将查询结果转换为 List 需要一部分时间,这很重要,但如果转换是唯一的方法,我应该接受一点速度损失。
  • @Dennis 我想在其中搜索(基于具有不同类型和不同方法的不同字段 - 假设对于 int 我们想要一个 Range 搜索,对于 string 我们想要一个 Contain 搜索),重新排序它们,过滤它们和诸如此类的东西
猜你喜欢
  • 2017-08-29
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多