【问题标题】:if my join fails, it seems to fail the linq query in its entirety如果我的加入失败,则似乎整个 linq 查询都失败了
【发布时间】:2014-04-16 14:10:23
【问题描述】:

我有以下代码:

public SiteViewModel SVMGetByID(int siteID)
{
    SiteViewModel siteViewModel = (
        from site in context.Sites
        join address in context.Addresses on site.AddressID equals address.AddressID
        //join city in context.Cities on address.CityID equals city.CityID
        join country in context.Countries on address.CountryID equals country.CountryID // This needs to be a left join I think?
        join state in context.States on address.StateID equals state.StateID // This needs to be a left join I think?
        where site.SiteID == siteID
        select new SiteViewModel
        {
            SiteID = site.SiteID,
            Name = site.Name,

            AddressID = address.AddressID,
            Address1 = address.Address1,
            Address2 = address.Address2,

            City = address.City,

            State = state,
            StateID = state.StateID,

            Country = country,
            CountryID = country.CountryID,

            ZIP = address.ZIP
        }
    ).FirstOrDefault();

    // If address.CityID and address.StateID have a value the siteViewModel is correctly filled,
    // otherwise it is not.
    return siteViewModel;
}

如果在我的数据库中,我的地址表包含 address.CityIDaddress.StateID 的空条目,它返回一个空结果...我实际上希望它返回一个结果,无论连接是否失败(左加入?)。

这两列用“允许空值”打勾...我的地址模型也表示Nullable<int>... 连接词应该是别的吗?

【问题讨论】:

  • “无法继续”是什么意思?会发生什么?
  • 我想我正在寻找如何在 linq 中进行左连接... OP 已修改

标签: c# linq entity-framework join


【解决方案1】:

您可以为此使用group join。查看this documentation

那里的例子:

var innerGroupJoinQuery =
from category in categories
join prod in products on category.ID equals prod.CategoryID into prodGroup
select new { CategoryName = category.Name, Products = prodGroup };

【讨论】:

  • 啊,我想通了……但我现在也要检查一下。
【解决方案2】:

您使用 into... 然后从下面执行 a 以将其连接到原始查询。

       SiteViewModel siteViewModel = (
            from site in context.Sites
            join address in context.Addresses on site.AddressID equals address.AddressID
            join country in context.Countries on address.CountryID equals country.CountryID into joinedCountry
            from country in joinedCountry.DefaultIfEmpty()
            join state in context.States on address.StateID equals state.StateID into joinedState
            from state in joinedState.DefaultIfEmpty()
            where site.SiteID == siteID
            select new SiteViewModel
            {
                SiteID = site.SiteID,
                Name = site.Name,

                AddressID = address.AddressID,
                Address1 = address.Address1,
                Address2 = address.Address2,

                City = address.City,
                //CityID = city.CityID,

                State = state,
                StateID = state.StateID,

                Country = country,
                CountryID = country.CountryID,

                ZIP = address.ZIP
            }
        ).FirstOrDefault();

        return siteViewModel;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多