【问题标题】:LINQ Join with multiple AND conditions具有多个 AND 条件的 LINQ Join
【发布时间】:2013-11-01 07:32:41
【问题描述】:

我想在我的 MVC 应用程序中加入两个实体,以便通过 LINQ 连接进行数据处理。

为此,我正在尝试编写如下查询,

from enumeration in db.Enumerations
join cust in db.Customers on ( enumeration.Value equals cust.lkpStatus &&       
enumeration.EnumerationTypeID.Contains('Cust')

但是我遇到了这个查询的问题,所以请给我一些建议。

【问题讨论】:

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


【解决方案1】:

应该像这样加入:

var joinQuery =
from t1 in Table1
join t2 in Table2
  on new { t1.Column1, t1.Column2 } equals new { t2.Column1, t2.Column2 }
...

【讨论】:

  • 我做了这个例子,在“join”中有一个错误。它说连接子句中的表达式之一不正确。对“加入”的调用中的类型推断失败。你知道它是什么吗?
  • IEnumerable model = from users in _db.Users join groupMembers in _db.GroupMembers on new { users.User_id } equals new { groupMembers.User_id } 两种情况都是长类型
  • 如果您在 LINQ 查询中错过了select 的完整代码。如果没有,请发布完整的 LINQ 查询。
  • IEnumerable model = from users in _db.Users join groupMembers in _db.GroupMembers on new { users.User_id } equals new { groupMembers.User_id } where groupMembers.User_id == null select new UserDropDownSearch { User_Id = users.User_id, LastName = users.LastName, };
  • 我认为问题在于GroupMembers 上的User_Id 属性属于long? 类型,而Users 上的User_id 属于long 类型。这可以防止内部联接起作用,而您的情况是外部联接。如我所见,您希望获得不属于任何组的用户。最简单的方法是在数据库中创建用户和组成员之间的外键,并让用户对象上的属性组处理对用户参与的组的引用。因此,要查找没有组的用户,您只需编写:var users = db.Users.Where(u => !u.Groups.Any())
【解决方案2】:

试试这个解决方案:

from enumeration in db.Enumerations.Where(e => 
                                          e.EnumerationTypeID.Contains('Cust'))
join cust in db.Customers on enumeration.Value equals cust.lkpStatus
select enumeration;

【讨论】:

  • 如果条件类似于 ---------------------------------- - 从 db.Enumerations.Where(x=>x.EnumerationTypeID.Equals("Customer.lkpStatus")) 中的枚举加入 db.Customers 中的 cust (enumeration.Value 等于 cust.lkpStatus) && cust.ID 等于数据。选择枚举;
  • 不,在这种情况下使用此解决方案: from enumeration in db.Enumerations.Where(x=>x.EnumerationTypeID.Equals("Customer.lkpStatus")) join cust in db.Customers.Where (c => c.ID == data) on enumeration.Value 等于 cust.lkpStatus 选择枚举;
  • 但是在这种情况下它不能加入因为“enumeration.Value”是一个字符串而“cust.lkpStatus”是一个int值。
  • 我认为 enumeration.Value 是一个 int 值。您想如何在其中一个字段不是 FK/PK 中加入表格!?
  • 我试过这样的---------------------------- var temp=(来自db.Enumerations中的枚举在 Convert.ToInt32(enumeration.Value) 上的 db.Customers 中加入 cust 等于 cust.lkpStatus 其中 (cust.ID==data.ID && enumeration.EnumerationTypeID.Contains("Customer.lkpStatus") ) 选择枚举).FirstOrDefault() ; ------------------------------------------------------- 但它也不能正常工作
【解决方案3】:

这个?

var data =     from c in db.Enumerations
               from d in db.Customers
               where c.Value.Equals(d.lkpStatus)
               && c.EnumerationTypeID.Contains('Cust')
               select c;

【讨论】:

  • where 执行内部连接,并将排除第二列为 NULL 的结果。
【解决方案4】:

这行得通

var data = from c in db.Enumerations from d in db.Customers where c.Value==d.lkpStatus && c.EnumerationTypeID.Contains('Cust') select c;

【讨论】:

  • 此答案与上一个答案重复。
猜你喜欢
  • 2017-04-07
  • 2013-08-19
  • 1970-01-01
  • 2022-12-11
  • 2021-11-16
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多