linq查询具有不同属性的多个表

Posted

技术标签:

【中文标题】linq查询具有不同属性的多个表【英文标题】:Linq query multiple tables with different attributes 【发布时间】:2012-12-11 03:45:11 【问题描述】:

我有一个搜索要寻找两件事。项目和联系人。他们每个人都有自己的桌子,拥有自己独特的属性。我能够成功地相互独立地搜索每个并将结果返回到两个列表视图。但它是否丑陋并且分页已成为一个问题,所以我必须将这两个表转换为可以显示为搜索结果的类似结果。这些结果彼此之间没有直接关系。

group t3 by new 让我失望了。我是否必须将它们分组才能使其成为类似的结果?结果当前显示在 ListView 中,例如使用 <%#Eval("ItemName") %>

ItemContext db = new ItemContext(); //DB connection (Item,Contact)
            var q = (from t1 in db.Item
                     join t2 in db.Categories on t1.CategoryID equals t2.CategoryID
                     join t7 in db.Divisions on t1.DivisionID equals t7.DivisionID
                     from t3 in db.Contacts
                     join t4 in db.Categories on t3.CategoryID equals t4.CategoryID
                     join t5 in db.Divisions on t3.DivisionID equals t5.DivisionID
                     join t6 in db.ContactTitle on t3.ContactTitlesID equals t6.ContactTitlesID


                     where


                    (DDLInt == 1 || t3.DivisionID == DDLInt) &&

                         //Contains

                    (
                     t3.ContactName.Contains(keyword) ||
                     t3.ContactEmail.Contains(keyword) ||
                     t3.ContactOPhone.Contains(keyword) ||
                     t3.ContactID.Equals(searchID)


                     )
                     group t3 by new
                     
                         t3.ContactID,
                         t3.ContactName,
                         t3.ContactOPhone,
                         t3.ContactCell,
                         t3.ContactEmail,
                         t3.DivisionID,
                         t3.CategoryID,
                         t4.CategoryName,
                         t5.DivisionName,
                         t6.ContactTitlesName

                     

                        into i

                     select new
                     
                         i.Key.ContactID,
                         i.Key.ContactName,
                         i.Key.ContactOPhone,
                         i.Key.ContactEmail,
                         i.Key.ContactCell,
                         i.Key.CategoryName,
                         i.Key.DivisionName,
                         i.Key.CategoryID,
                         i.Key.DivisionID,
                         i.Key.ContactTitlesName
                     );


            return q.ToList<dynamic>();
        

【问题讨论】:

【参考方案1】:

使用Union():

var contacts = from c in db.Contacts
              select new 
                           Id = c.ContactID,
                           Name = c.ContactName,
                           Phone = c.ContactOPhone,
                           ...
                           CategoryName = c.Category.CategoryName,
                           DivisionName = c.Division.DivisionName,
                           ContactTitlesName = c.ContactTitle.ContactTitlesName
                         
var items = from t1 in db.Item
            select new 
                         Id = t1.ItemID,
                         Name = t1.ItemName,
                         Phone = t1.??, // string.Empty?
                         ... // more properties corresponding
                             // with the ones above
                         CategoryName = t1.Category.CategoryName,
                         DivisionName = t1.Division.DivisionName,
                         ContactTitlesName = string.Empty
                       
var all = contacts.Union(items);

【讨论】:

非常感谢!那工作得很好。我现在需要更改其他内容。我使用 QueryString 从我的结果中链接。当我链接到详细信息页面时,有没有办法可以按类型(项目、联系人)识别它们?例如NavigateUrl='&lt;%#Eval("ID", "~/LoggedIn/ContactDetails.aspx?ContactID=0") %&gt;' /&gt; 向匿名类型添加一个字段(例如 Type = "Contact" 或 "Item")。

以上是关于linq查询具有不同属性的多个表的主要内容,如果未能解决你的问题,请参考以下文章

具有多个 where 子句的 Linq to Datatable

具有多重嵌套表的分组方式和计数作为 LINQ 查询

如何选择具有最低属性 linq 查询语法的对象

优化多个 LINQ to Entity Framework 查询

PostgreSQL 中具有特定模式的 Linq 和实体迁移

Linq 查询根据日期和优先级获取不同的对象