【问题标题】:SQL to Linq C# EntityFrameWork QuerySQL to Linq C# Entity FrameWork 查询
【发布时间】:2021-07-12 12:32:52
【问题描述】:

我无法在 EntityFrameWork 上编写此查询。这很简单,但我还不知道 EF。* 我需要 EF 上的 4 个表左连接。

select ProductId,Name,ValueName,Value from ProductTechnicalInfo p 
left join ProductTechnicalInfoParameter pp on pp.ProductTechnicalInfoId = p.Id 
left join ProductTechnicalInfoValue v on v.ProductTechicalInfoId = p.Id
left join ProductTechnicalInfoValueParameter vp on vp.TechnicalValuesId=v.Id
where ProductId = 22

我的 EF 代码:

var infos = infoProductsRep.Join(transaction.ProductTechnicalInfoParameter, p => p.Id, pp => pp.ProductTechnicalInfoId, (ProductTechnicalInfo, ProductTechnicalInfoParameter) => new
{
    ProductTechnicalInfo,
    ProductTechnicalInfoParameter
}).Join(transaction.ProductTechnicalInfoValue, p => p.ProductTechnicalInfo.Id, v => v.Id, (Info, Value) => new
{
    Info,
    Value
}).Join(transaction.ProductTechnicalInfoValueParameter, p => p.Value.Id, vp => vp.TechnicalValuesId, (Info, Result) => new
{
    Info,
    Result
}).Where(x => x.Info.Info.ProductTechnicalInfo.ProductId == product.Id).ToList();

【问题讨论】:

  • 你最好把它留在 SQL 中。使用原始 EF 查询来执行它。见docs.microsoft.com/en-us/ef/core/querying/raw-sql
  • 仅供参考,如果您在数据库中建立关系并正确设置了实体,您应该很少需要加入。
  • 谢谢罗伯特
  • @aaliakinci 真正的答案是you don't need joins if you configure relations
  • 您使用的是 EF 6 还是 EF Core?您标记您正在使用 asp.net-core,所以我假设您正在使用 EF Core。 EF Core 中的查询引擎已重写,因此您还需要提供 EF 版本号。

标签: c# sql entity-framework linq asp.net-core


【解决方案1】:

属性名称可能存在一些问题,但您的查询很容易转换为 LINQ:

var query = 
    from p in infoProductsRep
    join pp in transaction.ProductTechnicalInfoParameter on p.Id equals pp.ProductTechnicalInfoId into gpp
    from pp in gpp.DefaultIfEmpty()
    join v in transaction.ProductTechnicalInfoValue on p.Id equals v.ProductTechicalInfoId into gv
    from v in gv.DefaultIfEmpty()
    join vp in transaction.ProductTechnicalInfoValueParameter on p.Id equals vp.TechnicalValuesId into gvp
    from vp in gvp.DefaultIfEmpty()
    where p.ProductId == 22
    select new 
    {
        p.ProductId,
        pp.Name,
        v.ValueName,
        vp.Value
    };

var result = query.ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多