2017-03-17 16 views
0

我有2类A和B,其中,我希望执行LINQ查询返回类A(与它的所有成员)加入来自枯草LINQ的执行与具有场沿场更新

这里是类中,我就要回:

public partial class A 
{ 
    // fields in A 
    public int classID { get; set; } 
    public string mem_1A { get; set; } 
    public string mem_2A { get; set; } 
    public int points { get; set; } 
    // ... 
} 

这是在我加入反对阶级:

public partial class B 
{ 
    // fields in B 
    public int classID { get; set; } 
    public string mem_1B { get; set; } 
    public string mem_2B { get; set; } 
    public int points { get; set; } 
    // ... 
} 

我已经尝试下面的变化,但我无法得到它加工。

var db = new MyDBContext(); 

IEnumerable<A> result1 = 
    from tblA in db.A 
    join tblB in db.B on tblA.classID equals tblB.classID 
    select tblA; 

IEnumerable<A> result2 = db.A.Join(db.B, x => x.classID, y => y.classID,(x,y) => x); 

我只是得到一个所有成员,但我在class Apoints变量为空。我知道我需要从B的角度进行任务,但我不知道该怎么做。什么是正确的方法来做到这一点?

回答

2

你可以试试这个:

var result1 = 
    from tblA in db.A 
    join tblB in db.B on tblA.classID equals tblB.classID 
    select new { ClassA = tblA, PointsOfB = tblB.points }; 

这将创建一个拥有TBLA和TBLB的点一个匿名类。


更新当前值:

var result1 = 
    (from tblA in db.A 
    join tblB in db.B on tblA.classID equals tblB.classID 
    select new { ClassA = tblA, PointsOfB = tblB.points }).ToArray(); // <-- note this.... 

foreach(var r in result1) 
    r.ClassA.points = r.PointsOfB; 

IEnumerable<A> classAUpdated = result1.Select(a => a.ClassA); 

或者在同一行:

IEnumerable<A> classAList = db.A 
    .Join(db.B, a => a.classID, b => b.classID,(a,b) => new 
     { 
      ClassA = a, 
      PointsOfB = b.points 
     }).ToArray() // <---------- to persist it 
    .Select(ab => 
     { 
      ab.ClassA.points = ab.PointsOfB; 
      return ab.ClassA; 
     }); 

但是,你应该对它进行测试。

+0

有没有一种方法来创建类'A',而不是匿名类? – usr4896260

+1

然后您需要分配值或重新创建类。我会举一个例子。问题是,你无法更新行。你需要在数据库中更新行吗? –

+0

这一行几乎奏效。它在发生点赋值时抛出一个错误:'带有语句正文的lambda表达式不能转换为表达式树。一个表达式树可能不包含赋值操作符' – usr4896260

1

我认为这是你想要的

var result2 = db.A.Join(db.B, x => x.classID, y => y.classID,(x,y) => 
       new{classA = x, 
       pontOfB = y.points }); 

,如果你想在ClassA的,试试这个

var result2 = db.A.Join(db.B, x => x.classID, y => y.classID,(x,y) => 
       new classA { 
       classId = x.classId, 
       mem_1a = x.mem_1a, 
       mem_1b = x.mem_1b,     
       points = y.points }); 
+0

有没有办法创建类“A”而不是匿名类? – usr4896260

+1

在这种情况下,你将从b存储你的积分......另一种方法是创建一个新的classA和点作为其成员 – CPR43

+0

从'B'的积分将存储在'A'中。所以'A.points = B.points'。 – usr4896260