C# 将LINQ的选择方法推广到EF5中的实体

C# 将LINQ的选择方法推广到EF5中的实体,c#,linq,C#,Linq,我有许多交叉链接表,其中有两个链接列链接到父表,例如: CREATE TABLE [dbo].[InsuranceDocuments] ( [InsuranceDocumentId] [bigint] IDENTITY(1,1) NOT NULL, [InsuranceId] [bigint] NOT NULL, [DocumentId] [bigint] NOT NULL ) CREATE TABLE [dbo].[PersonDocuments] ( [Pe

我有许多交叉链接表,其中有两个链接列链接到父表,例如:

CREATE TABLE [dbo].[InsuranceDocuments]
(
    [InsuranceDocumentId] [bigint] IDENTITY(1,1) NOT NULL,
    [InsuranceId] [bigint] NOT NULL,
    [DocumentId] [bigint] NOT NULL
)

CREATE TABLE [dbo].[PersonDocuments]
(
    [PersonDocumentId] [bigint] IDENTITY(1,1) NOT NULL,
    [PersonId] [bigint] NOT NULL,
    [DocumentId] [bigint] NOT NULL
)
1) 保险ID链接到保险表

2) PersonId链接到Persons表

3) DocumentId链接到Documents表

在“人员详细信息”或“保险详细信息”等屏幕上,只需显示文档信息 在初始加载时,我的“文档列表”结构对于所有类似的情况都是相同的。文件表 定义我将省略(太大),但它有一些基本的东西,如路径、DocumentCategoryId等

这是我个人和保险文件的LINQ:

 public IEnumerable<Models.SearchResult.Document> GetInsuranceDocuments(long parentId)
        {

            using (var db = Core.GetDb())
            {

                var items = db.InsuranceDocuments.Where(a => a.InsuranceId == parentId)
                    .Select(a => new Models.SearchResult.Document
                    {
                        CategoryId = a.Document.DocumentCategoryId,
                        TypeId = a.Document.DocumentTypeId,
                        CreateDate = a.CreateDate,
                        Name = (a.Document.DocumentName == null ? a.Document.DocumentPath : a.Document.DocumentName)

                    }).OrderBy(a=>a.Name).ToArray();
                return items;
            }

        }

 public IEnumerable<Models.SearchResult.Document> GetPersonDocuments(long parentId)
        {

            using (var db = Core.GetDb())
            {

                var items = db.PersonDocuments.Where(a => a.PersonId == parentId)
                    .Select(a => new Models.SearchResult.Document
                    {
                        CategoryId = a.Document.DocumentCategoryId,
                        TypeId = a.Document.DocumentTypeId,
                        CreateDate = a.CreateDate,
                        Name = (a.Document.DocumentName == null ? a.Document.DocumentPath : a.Document.DocumentName)

                    }).OrderBy(a=>a.Name).ToArray();
                return items;
            }
    }
public IEnumerable GetInsuranceDocuments(长父ID)
{
使用(var db=Core.GetDb())
{
var items=db.InsuranceDocuments.Where(a=>a.InsuranceId==parentId)
.Select(a=>newmodels.SearchResult.Document
{
CategoryId=a.Document.DocumentCategoryId,
TypeId=a.Document.DocumentTypeId,
CreateDate=a.CreateDate,
Name=(a.Document.DocumentName==null?a.Document.DocumentPath:a.Document.DocumentName)
}).OrderBy(a=>a.Name).ToArray();
退货项目;
}
}
公共IEnumerable GetPersonDocuments(长parentId)
{
使用(var db=Core.GetDb())
{
var items=db.PersonDocuments.Where(a=>a.PersonId==parentId)
.Select(a=>newmodels.SearchResult.Document
{
CategoryId=a.Document.DocumentCategoryId,
TypeId=a.Document.DocumentTypeId,
CreateDate=a.CreateDate,
Name=(a.Document.DocumentName==null?a.Document.DocumentPath:a.Document.DocumentName)
}).OrderBy(a=>a.Name).ToArray();
退货项目;
}
}
正如您所看到的,选择方法对于这两种方法都是相同的
很高兴能概括这一部分,我需要帮助。
谢谢。

提取方法并使用它

public Models.SearchResult.Document[] GetDocumentsArray(IQueryable<Models.SearchResult.Document> docs)
{
     return docs.Select(a => new Models.SearchResult.Document
                    {
                        CategoryId = a.Document.DocumentCategoryId,
                        TypeId = a.Document.DocumentTypeId,
                        CreateDate = a.CreateDate,
                        Name = (a.Document.DocumentName == null ? a.Document.DocumentPath : a.Document.DocumentName)

                    }).OrderBy(a=>a.Name).ToArray();
}

是的,差不多了!仅当返回IQueryable时,应为GetDocumentsArray(IQueryable文档)?调用也应该是GetDocumentsArray(db.PersonDocuments.Where(a=>a.PersonId==parentId)。选择(a=>a.Document))?@vlscanner是的,应该有Iqueryable,但是如果不将调用更改为.Select(a=>a.Document),调用将不会更改编译器抱怨,但PersonDocuments和Documents表之间的关系我在问题中没有涉及太多,有1对多的链接,但这个答案对我有效,我会这样标记它。谢谢
var items = GetDocumentsArray(db.PersonDocuments.Where(a => a.PersonId == parentId));