我正在使用EF从MySQL数据库中获取数据。
现在,我有两个表,第一个是customers和project_codes。
表project_codes对名为id_customers的客户有一个FK。通过这种方式,我可以查询哪些项目属于客户。
在我的DAL上,我得到了以下内容:
public List<customer> SelectAll()
{
using (ubmmsEntities db = new ubmmsEntities())
{
var result = db.customers
.Include(p => p.project_codes)
.OrderBy(c=>c.customer_name)
.ToList();
return result;
}
}
向我输出我的所有客户及其各自的project_codes。
最近我只需要获取项目代码,所以我创建了一个DAL来从我的数据库中获取所有项目代码。但后来我开始思考:&#34;我应该这样做吗?最好不要使用我的SelectAll()
方法,并使用Linq从我的所有客户那里获取project_codes列表?
所以这是我的第一个问题。我的意思是,从可维护性的角度来看,尽可能多地重用方法是件好事,对吧?
第二个问题是,如何将所有project_codes放到List中?直接这样做很容易,但我没有以SelectAll()
为基础实现这一目标。
如果我使用customer_id,那就好了。
ddlProject.DataSource = CustomerList.Where(x => x.id.Equals(customer_id))
.Select(p => p.project_codes).FirstOrDefault();
这超出了我对该客户的项目代码,但我尝试了不同的方法(foreach,在哪里和其他一些随机)但是他们要么语法失败,要么不输出包含所有project_codes的列表。所以这是我使用特定方法获取项目代码的另一个原因。
即使&#34;常识&#34;或者最佳实践说重新利用上面提到的方法是一个坏主意,我想要了解如何使用SelectAll()
的返回来实现project_codes列表的一些指示...永远不知道什么时候可以来在手。
让我知道你的想法。
答案 0 :(得分:1)
这里有一个权衡;您要么在内存集合中迭代更大的集合(并进行选择等),要么迭代较小的集合,但必须转到数据库才能执行此操作。
您需要对您的设置进行概要分析,以确定哪个更快,但内存方法完全可能更好(如果您的数据可能已经更改,则可能会过时!)。
要获得所有project_codes,您应该只需要:
List<customer> customers; //Fill from DAL
List<project_code> allProjects = customers.SelectMany(c => c.project_codes).ToList();
请注意,我使用SelectMany
来展平集合的层次结构,我认为SelectAll
实际上不是LINQ方法。