实体框架内部联接

时间:2015-05-04 08:14:02

标签: c# entity-framework join

我有两张这样的表:

客户:

  • 电子邮件
  • 用户名

产品:

  • 用户名
  • 产品

我想填写一个包含用户名,产品和电子邮件的课程。

这就是我所拥有的

var res = from H in db.Products
          join C in db.customers on H.Username equals C.Username
          where C.Username == H.Username
          select H;

Results results = res.Single();

然而,问题是,我不确定这是如何运作的,有人可以为我分解吗?

1 个答案:

答案 0 :(得分:0)

var div = document.getElementById('div');
var btn;
var category = ["fur_", "fts_", "fas_"];
var handler = function () {
    alert('Clicked');
};
for (var i = 1; i < category.length; i++) {
    btn = document.createElement('button');
    btn.cassName = category[i];
    btn.cassName = 'myBtn' + i;
    btn.innerHTML = '....';
    btn.addEventListener('click', handler, false);
    div.appendChild(btn);
}

上面的代码在C和H之间建立了一个内部联接(where子句不是必需的),并导致所有元素返回到存在适当连接的产品和客户条目的位置。

选择H“just”返回产品的所有数据。如你所说,你想要一个混合,你需要以不同的方式做到这一点。

我自己会使用匿名类型(或dto对象)。 对于匿名类型:

  var res = from H in db.Products
                      join C in db.customers on H.Username equals C.Username
                      where C.Username == H.Username
                      select H;

            Results results = res.Single();

放在一起:

select new { Username = H.Username, Product = H.Product, EMail = C.EMail}

对于DTO(数据传输对象),您将创建一个具有公共set / get属性的类,并使用select new myClass(){....}而不是select new {}。

DTO在重用方面更好,并且您在编写错误名称时遇到的问题较少,....

只是简单地使用select H,C遗憾地无法工作,因为Linq想要每行返回单个对象(并且另外总是使用相同的数据类型)。因此,您需要在要返回的对象周围放置一个容器。在这种情况下,无论是匿名类型还是DTO。