Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq到实体左外连接_C#_Linq To Entities_Left Join - Fatal编程技术网

C# 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 这应该会有帮助,这是我不久前写的一篇博文,应该仍然是相关的,并且可能对可测试性也有帮助 生成实体模型时,还要确保

我正在努力让linq离开外部连接。我有两个实体(表):

我想用LINQ写一些类似的东西:

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};
}
结果变量将包含:

  • {ListingID=“Test 1”,MakeID=1,description=“Make 1”}
  • {ListingID=“Test 2”,MakeID=1,description=“Make 1”}
  • {ListingID=“No Make”,MakeID=null,description=“NA”}
  • {ListingID=“Test 3”,MakeID=3,description=“Make 3”}
  • {ListingID=“另一个Makeless”,MakeID=null,description=“NA”}

  • 不是在开发人员机器前进行检查,但可能是这样的

    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)
        };