C# linq到实体左外连接
我正在努力让linq离开外部连接。我有两个实体(表): 我想用LINQ写一些类似的东西:C# linq到实体左外连接,c#,linq-to-entities,left-join,C#,Linq To Entities,Left Join,我正在努力让linq离开外部连接。我有两个实体(表): 我想用LINQ写一些类似的东西: select listings.listingID ,listings.makeid , IsNull(makes.Description, 'NA') from listings left outer join makes on listings.makeid = makes.makeid 这应该会有帮助,这是我不久前写的一篇博文,应该仍然是相关的,并且可能对可测试性也有帮助 生成实体模型时,还要确保
select listings.listingID
,listings.makeid
, IsNull(makes.Description, 'NA')
from listings
left outer join makes
on listings.makeid = makes.makeid
这应该会有帮助,这是我不久前写的一篇博文,应该仍然是相关的,并且可能对可测试性也有帮助
生成实体模型时,还要确保外键已就位,这将有助于设置依赖项。下面是实现左连接的解决方案。就其他资源而言,我真的建议试用LINQPad:它是linq的一个很好的学习工具
// Listing class/container/table
public class Listing
{
public string ListingID {get;set;}
public Int32? MakeID {get;set;}
}
// Make class/container/table
public class Make
{
public Int32 MakeID {get;set;}
public string Description {get;set;}
}
public class Main
{
public static void LinqMain()
{
// Populate the listing table with data
List<Listing> listings = new List<Listing>()
{
new Listing() { ListingID = "Test 1", MakeID = 1 },
new Listing() { ListingID = "Test 2", MakeID = 1 },
new Listing() { ListingID = "No Make", MakeID = null },
new Listing() { ListingID = "Test 3", MakeID = 3 },
new Listing() { ListingID = "Another Makeless", MakeID = null }
};
// Populate the makes table with data
List<Make> makes = new List<Make>()
{
new Make() { MakeID = 1, Description = "Make 1"},
new Make() { MakeID = 2, Description = "Make 2"},
new Make() { MakeID = 3, Description = "Make 3"},
new Make() { MakeID = 4, Description = "Make 4"}
};
// Return the left join on Make Id
var result = from l in listings
// These two lines are the left join.
join leftm in makes on l.MakeID equals leftm.MakeID into leftm
from m in leftm.DefaultIfEmpty()
// To ensure the select does not get bogged down with too much logic use the let syntax
let description = m == null ? "NA" : m.Description
select new { l.ListingID, l.MakeID, description };
}
//列出类/容器/表
公共类列表
{
公共字符串ListingID{get;set;}
public Int32?MakeID{get;set;}
}
//制作类/容器/表格
公开课制作
{
public Int32 MakeID{get;set;}
公共字符串说明{get;set;}
}
公共班机
{
公共静态void LinqMain()
{
//用数据填充列表表
列表列表=新列表()
{
new Listing(){ListingID=“Test 1”,MakeID=1},
new Listing(){ListingID=“Test 2”,MakeID=1},
new Listing(){ListingID=“No Make”,MakeID=null},
new Listing(){ListingID=“Test 3”,MakeID=3},
新列表(){ListingID=“另一个Makeless”,MakeID=null}
};
//用数据填充make表
列表生成=新列表()
{
new Make(){MakeID=1,Description=“Make 1”},
新建Make(){MakeID=2,Description=“Make 2”},
新建Make(){MakeID=3,Description=“Make 3”},
新建Make(){MakeID=4,Description=“Make 4”}
};
//返回Make Id上的左连接
var结果=列表中的l
//这两条线是左连接。
在l.MakeID等于leftm.MakeID的makes中将leftm连接到leftm
从leftm.DefaultIfEmpty()中的m开始
//为了确保select不会因为太多的逻辑而陷入困境,请使用let语法
让description=m==null?“NA”:m.description
选择新的{l.ListingID,l.MakeID,description};
}
结果变量将包含:
不是在开发人员机器前进行检查,但可能是这样的
var x = from l in listings
join m in makes on l.makeid equals m.makeid into g
from ma in g.DefaultIfEmpty()
select new
{
l.listingID,
l.makeid,
(ma.Description == null ? "NA" : ma.Description)
};
如果您有任何问题,请告诉我,我会检查我的工作电脑。任何告诉您在LINQ to Entities中使用.DefaultIfEmpty()作为外部联接的一部分的人都没有亲自尝试过!Tt根本不起作用-至少在.NET 3.5 SP1中是这样
告诉您实际应该如何做。本质上,.NET默认情况下在LINQ中对外连接到实体,因此您应该省去.DefaultIfEmpty()。对于多个外部联接,您必须嵌套查询组以保持其上下文清晰。我没有联接这两个表。我不能在不联接它们的情况下选择数据。@Seravy:非常详细的回答:)谢谢@Seravy,但我遇到了此错误,LINQ to Entities无法识别方法“System.Collections.Generic.IEnumerable
1”[AutoSales.AutoSalesCore.Domain.Impl.Categories]DefaultIfEmpty[Categories](System.Collections.Generic.IEnumerable
1[AutoSales.AutoSalesCore.Domain.Impl.Categories])方法,此方法无法转换为存储表达式。因为DefaultIfEmpty()不适用于linq to实体。
var x = from l in listings
join m in makes on l.makeid equals m.makeid into g
from ma in g.DefaultIfEmpty()
select new
{
l.listingID,
l.makeid,
(ma.Description == null ? "NA" : ma.Description)
};