相关疑难解决方法(0)

LINQ中的LEFT OUTER JOIN

如何在不使用join-on-equals-into子句的情况下在C#LINQ中对对象执行左外连接?有没有办法用where条款做到这一点?正确的问题:对于内连接很容易,我有这样的解决方案

List<JoinPair> innerFinal = (from l in lefts from r in rights where l.Key == r.Key
                             select new JoinPair { LeftId = l.Id, RightId = r.Id})
Run Code Online (Sandbox Code Playgroud)

但对于左外连接我需要一个解决方案.我是这样的,但它不起作用

List< JoinPair> leftFinal = (from l in lefts from r in rights
                             select new JoinPair { 
                                            LeftId = l.Id, 
                                            RightId = ((l.Key==r.Key) ? r.Id : 0
                                        })
Run Code Online (Sandbox Code Playgroud)

JoinPair是一个类:

public class JoinPair { long leftId; long rightId; }
Run Code Online (Sandbox Code Playgroud)

c# linq join

505
推荐指数
12
解决办法
64万
查看次数

LINQ to SQL左外连接

此查询是否等同于LEFT OUTER连接?

//assuming that I have a parameter named 'invoiceId' of type int
from c in SupportCases
let invoice = c.Invoices.FirstOrDefault(i=> i.Id == invoiceId)
where (invoiceId == 0 || invoice != null)    
select new 
{
      Id = c.Id
      , InvoiceId = invoice == null ? 0 : invoice.Id
}
Run Code Online (Sandbox Code Playgroud)

.net linq database linq-to-sql

135
推荐指数
4
解决办法
14万
查看次数

Linq加入iquery,如何使用defaultifempty

我有一个linq连接查询wriiten,我想取值,如果其中一个是空的...

码:

var Details = 

UnitOfWork.FlightDetails
          .Query()
          .Join
          (
              PassengersDetails,
              x => x.Flightno,
              y => y.FlightNo,
              (x, y) => new
              {
                  y.PassengerId,
                  y.classType,
                  x.Flightno,
                  x.FlightName,
              }
          );
Run Code Online (Sandbox Code Playgroud)

我想用...

"Above query".DefaultIfEmpty
(
    new 
    {
        y.PassengerId,
        y.classType,
        string.Empty,
        string.Empty
    }
);
Run Code Online (Sandbox Code Playgroud)

"FlightDetails"是类上的Idatarepository类型,"PassengerDetails"是可查询的局部变量结果.如何获得乘客ID和Classtype的结果,并且整体结果中不包含flightno和flightname.

c# linq asp.net-mvc-4

29
推荐指数
1
解决办法
6万
查看次数

Linq中的lambda /方法语法中的左外连接

可能重复:
如何使用linq扩展方法执行左外连接

我找不到Linq lambda的左外连接示例(使用扩展方法),至少不是一个明确的.

假设我有下表:

Parent
{
    PID     // PK
}

Child
{
    CID     // PK
    PID     // FK
    Text
}
Run Code Online (Sandbox Code Playgroud)

我想加入Parent with Child,对于每个失踪的孩子,我希望Text的默认值为"[[Empty]]".我怎么能用linq lambda语法做到这一点?

我目前有以下内容:

var source = lParent.GroupJoin(
    lChild,
    p => p.PID,
    c => c.PID,
    (p, g) =>
        new // ParentChildJoined
        {
            PID = p.PID;
            // How do I add child values here?
        });
Run Code Online (Sandbox Code Playgroud)

.net c# linq

28
推荐指数
2
解决办法
5万
查看次数

如何使用Dynamic Linq进行左外连接?

我试图在这里模仿左外连接,但使用动态linq扩展方法.是)我有的:

public static IQueryable SelectMany(this IQueryable source, string selector, 
    string resultsSelector, params object[] values)
{
    if (source == null) throw new ArgumentNullException("source");
    if (selector == null) throw new ArgumentNullException("selector");

    // Parse the lambda 
    LambdaExpression lambda = DynamicExpression.ParseLambda(
        source.ElementType, null, selector, values);

    // Fix lambda by recreating to be of correct Func<> type in case  
    // the expression parsed to something other than IEnumerable<T>. 
    // For instance, a expression evaluating to List<T> would result  
    // in a …
Run Code Online (Sandbox Code Playgroud)

.net c# linq dynamic-linq linq-to-sql

23
推荐指数
1
解决办法
4672
查看次数

使用LINQ的IQueryable左外连接的扩展方法

我试图用返回类型实现左外连接扩展方法IQueryable.

我写的功能如下

public static IQueryable<TResult> LeftOuterJoin2<TOuter, TInner, TKey, TResult>(
        this IQueryable<TOuter> outer,
        IQueryable<TInner> inner,
        Func<TOuter, TKey> outerKeySelector,
        Func<TInner, TKey> innerKeySelector,
        Func<TOuter, TInner, TResult> resultSelector)
{
        return
          from outerItem in outer
          join innerItem in inner on outerKeySelector(outerItem) 
            equals innerKeySelector(innerItem) into joinedData
          from r in joinedData.DefaultIfEmpty()
          select resultSelector(outerItem, r);
}
Run Code Online (Sandbox Code Playgroud)

它无法生成查询.原因可能是:我用过Func<>而不是Expression<>.我也尝试过Expression<>.它给我一个在线错误outerKeySelector(outerItem),这outerKeySelector是一个被用作方法的变量

我发现了一些关于SO(比如这里)和CodeProjects的讨论,但那些适用于IEnumerable不适合的类型IQueryable.

.net c# linq

21
推荐指数
3
解决办法
2万
查看次数

左连接两个列表并使用Linq从右侧维护一个属性

我有2个相同类型的列表.左侧列表:

var leftList = new List<Person>();
leftList.Add(new Person {Id = 1, Name = "John", Changed = false});
leftList.Add(new Person {Id = 2, Name = "Alice", Changed = false});
leftList.Add(new Person {Id = 3, Name = "Mike", Changed = false});
Run Code Online (Sandbox Code Playgroud)

正确的清单:

var rightList = new List<Person>();
rightList.Add(new Person {Id = 1, Name = "John", Changed = false});
rightList.Add(new Person {Id = 3, Name = "Mike", Changed = true});
rightList.Add(new Person {Id = 4, Name = "Joshi", Changed = true}); …
Run Code Online (Sandbox Code Playgroud)

c# linq

10
推荐指数
2
解决办法
1万
查看次数

在Linq-to-SQL中模拟多表继承

到目前为止,每个人都知道Linq-to-SQL本身不支持多表继承(又称table-per-subtype),并且你可以使用其他ORM框架,如Entity Framework,NHibernate等,如果你想要原生的话支持多表继承(如果您有任何疑问,请参考SO问题" LINQtoSQL中的多重继承 ").

但是,假设您确实想要使用(或仅限于使用)Linq-to-SQL作为您的ORM层,那么任何人都可以确定一个简单而直接的设计策略来模拟 Linq-to-SQL项目中的多表继承,以便客户端代码可以使用自然的,面向对象的API针对Linq-to-SQL层编写?

.net multiple-inheritance linq-to-sql

5
推荐指数
1
解决办法
842
查看次数

LINQ LEFT JOIN 不适用于 NULL 值

我有两个表StudentMarks

学生表具有以下字段: StudentID, Name, MarkID(Nullable)标记表具有以下字段: MarkID,Mark

学生桌

StudentID   Name    MarkID

1           Mark    1 

2           Mike    NULL

3           John    NULL

4           Paul    2
Run Code Online (Sandbox Code Playgroud)

标记表

MarkID  Mark

1       80

2       100
Run Code Online (Sandbox Code Playgroud)

如果我使用左连接,那么我只会得到markpaul记录。我想要左表中的所有记录(Student)我的查询是:

   var query = (from s in Students  
               join m in Marks on s.MarkID equals m.MarkID 
               into mar from subMark in mar.DefaultIfEmpty()
               where(m.Mark > 80)
               Select s.Name)
               .ToList() 
Run Code Online (Sandbox Code Playgroud)

注意:这只是一个例子。使用左连接连接两个表并在第二个表上应用 where 条件时,如果第一个表中连接的列值为空,则不会从第一个表中获取记录。

c# linq

5
推荐指数
2
解决办法
2万
查看次数

使用lambda表达式左连接

我有tableA和tableB.
我想使用lambda表达式执行左连接.这是相同的sql语句:

SELECT *
FROM tableA A
    LEFT JOIN tableB B ON A.userId=B.userId
Run Code Online (Sandbox Code Playgroud)

我怎么能用lambda表达式做到这一点?

.net c# lambda entity-framework

4
推荐指数
1
解决办法
7811
查看次数

如何在Entity Framework Core 2.0上使用lambda语法在LINQ中实现LEFT OUTER JOIN?

我正在尝试针对实体框架核心2.0 DbContext在Linq中实现左外部联接。将查询转换为SQL,而不是在本地进行评估,这一点很重要。我已经查看了几种StackOverflow解决方案,其中包括一个不错的解决方案,但是没有一个使用EF Core。

我得到的问题是EF Core为该DefaultIfEmpty()方法返回以下警告/错误:

The LINQ expression 'DefaultIfEmpty()' could not be translated and will be evaluated locally

如果没有该DefaultIfEmpty()方法,则使用INNER JOIN。我的LINQ查询看起来像这样:

var join = context.Portfolios
           .Where(p => p.IsActive)
           .GroupJoin(context.BankAccounts, 
                      prt => prt.Id, 
                      bnk => bnk.PortfolioId, 
                      (prt, bnks) => new {Portfolio=prt,Account=bnks.DefaultIfEmpty()})
           .SelectMany(r => r.Accounts.DefaultIfEmpty(),
                       (p, b) => new 
                           {
                               Id = p.Portfolio.Id,
                               BankAccount = b.BankAccountNumber,
                               BankRef = b.BeneficiaryReference,
                               Code = p.Portfolio.Code,
                               Description = p.Portfolio.DisplayName
                           });
Run Code Online (Sandbox Code Playgroud)

有谁知道解决这个问题的方法吗?

c# linq lambda entity-framework-core .net-core

0
推荐指数
1
解决办法
4505
查看次数